1
+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
1
2
;; Test hoisting `xxspltib` out of the loop.
2
3
3
4
; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff --mcpu=pwr10 \
10
11
; RUN: %s -o - 2>&1 | FileCheck --check-prefix=LINUX64LE %s
11
12
12
13
define void @_Z3fooPfS_Pi (ptr noalias nocapture noundef %_a , ptr noalias nocapture %In_a , ptr noalias nocapture %n ) {
14
+ ; AIX64-LABEL: _Z3fooPfS_Pi:
15
+ ; AIX64: # %bb.0: # %entry
16
+ ; AIX64-NEXT: lwz 5, 0(5)
17
+ ; AIX64-NEXT: cmpwi 5, 1
18
+ ; AIX64-NEXT: bltlr 0
19
+ ; AIX64-NEXT: # %bb.1: # %for.body.preheader
20
+ ; AIX64-NEXT: li 6, 0
21
+ ; AIX64-NEXT: cmplwi 5, 1
22
+ ; AIX64-NEXT: beq 0, L..BB0_4
23
+ ; AIX64-NEXT: # %bb.2: # %for.body.preheader.new
24
+ ; AIX64-NEXT: rlwinm 6, 5, 0, 1, 30
25
+ ; AIX64-NEXT: xxspltib 0, 6
26
+ ; AIX64-NEXT: addi 9, 4, -8
27
+ ; AIX64-NEXT: addi 7, 3, -8
28
+ ; AIX64-NEXT: li 8, 8
29
+ ; AIX64-NEXT: li 10, 12
30
+ ; AIX64-NEXT: li 11, 4
31
+ ; AIX64-NEXT: addi 6, 6, -2
32
+ ; AIX64-NEXT: rldicl 6, 6, 63, 1
33
+ ; AIX64-NEXT: addi 6, 6, 1
34
+ ; AIX64-NEXT: mtctr 6
35
+ ; AIX64-NEXT: li 6, 0
36
+ ; AIX64-NEXT: .align 4
37
+ ; AIX64-NEXT: L..BB0_3: # %for.body
38
+ ; AIX64-NEXT: #
39
+ ; AIX64-NEXT: lxvwsx 1, 9, 8
40
+ ; AIX64-NEXT: addi 6, 6, 2
41
+ ; AIX64-NEXT: xxland 1, 1, 0
42
+ ; AIX64-NEXT: xscvspdpn 1, 1
43
+ ; AIX64-NEXT: stfsu 1, 8(7)
44
+ ; AIX64-NEXT: lxvwsx 1, 9, 10
45
+ ; AIX64-NEXT: addi 9, 9, 8
46
+ ; AIX64-NEXT: xxland 1, 1, 0
47
+ ; AIX64-NEXT: xxsldwi 1, 1, 1, 3
48
+ ; AIX64-NEXT: stfiwx 1, 7, 11
49
+ ; AIX64-NEXT: bdnz L..BB0_3
50
+ ; AIX64-NEXT: L..BB0_4: # %for.cond.cleanup.loopexit.unr-lcssa
51
+ ; AIX64-NEXT: andi. 5, 5, 1
52
+ ; AIX64-NEXT: bclr 4, 1, 0
53
+ ; AIX64-NEXT: # %bb.5: # %for.body.epil
54
+ ; AIX64-NEXT: sldi 5, 6, 2
55
+ ; AIX64-NEXT: xxspltib 1, 6
56
+ ; AIX64-NEXT: lxvwsx 0, 4, 5
57
+ ; AIX64-NEXT: xxland 0, 0, 1
58
+ ; AIX64-NEXT: xxsldwi 0, 0, 0, 3
59
+ ; AIX64-NEXT: stfiwx 0, 3, 5
60
+ ; AIX64-NEXT: blr
61
+ ;
62
+ ; AIX32-LABEL: _Z3fooPfS_Pi:
63
+ ; AIX32: # %bb.0: # %entry
64
+ ; AIX32-NEXT: lwz 5, 0(5)
65
+ ; AIX32-NEXT: cmpwi 5, 1
66
+ ; AIX32-NEXT: bltlr 0
67
+ ; AIX32-NEXT: # %bb.1: # %for.body.preheader
68
+ ; AIX32-NEXT: li 6, 0
69
+ ; AIX32-NEXT: beq 0, L..BB0_4
70
+ ; AIX32-NEXT: # %bb.2: # %for.body.preheader.new
71
+ ; AIX32-NEXT: xxspltib 0, 6
72
+ ; AIX32-NEXT: addi 12, 4, -8
73
+ ; AIX32-NEXT: addi 9, 3, -8
74
+ ; AIX32-NEXT: rlwinm 7, 5, 0, 1, 30
75
+ ; AIX32-NEXT: li 8, 0
76
+ ; AIX32-NEXT: li 10, 8
77
+ ; AIX32-NEXT: li 11, 12
78
+ ; AIX32-NEXT: .align 4
79
+ ; AIX32-NEXT: L..BB0_3: # %for.body
80
+ ; AIX32-NEXT: #
81
+ ; AIX32-NEXT: lxvwsx 1, 12, 10
82
+ ; AIX32-NEXT: addic 6, 6, 2
83
+ ; AIX32-NEXT: addze 8, 8
84
+ ; AIX32-NEXT: xor 0, 6, 7
85
+ ; AIX32-NEXT: or. 0, 0, 8
86
+ ; AIX32-NEXT: xxland 1, 1, 0
87
+ ; AIX32-NEXT: xscvspdpn 1, 1
88
+ ; AIX32-NEXT: stfsu 1, 8(9)
89
+ ; AIX32-NEXT: lxvwsx 1, 12, 11
90
+ ; AIX32-NEXT: addi 12, 12, 8
91
+ ; AIX32-NEXT: xxland 1, 1, 0
92
+ ; AIX32-NEXT: xscvspdpn 1, 1
93
+ ; AIX32-NEXT: stfs 1, 4(9)
94
+ ; AIX32-NEXT: bne 0, L..BB0_3
95
+ ; AIX32-NEXT: L..BB0_4: # %for.cond.cleanup.loopexit.unr-lcssa
96
+ ; AIX32-NEXT: andi. 5, 5, 1
97
+ ; AIX32-NEXT: bclr 4, 1, 0
98
+ ; AIX32-NEXT: # %bb.5: # %for.body.epil
99
+ ; AIX32-NEXT: slwi 5, 6, 2
100
+ ; AIX32-NEXT: xxspltib 1, 6
101
+ ; AIX32-NEXT: lxvwsx 0, 4, 5
102
+ ; AIX32-NEXT: xxland 0, 0, 1
103
+ ; AIX32-NEXT: xscvspdpn 0, 0
104
+ ; AIX32-NEXT: stfsx 0, 3, 5
105
+ ; AIX32-NEXT: blr
106
+ ;
107
+ ; LINUX64LE-LABEL: _Z3fooPfS_Pi:
108
+ ; LINUX64LE: # %bb.0: # %entry
109
+ ; LINUX64LE-NEXT: lwz 5, 0(5)
110
+ ; LINUX64LE-NEXT: cmpwi 5, 1
111
+ ; LINUX64LE-NEXT: bltlr 0
112
+ ; LINUX64LE-NEXT: # %bb.1: # %for.body.preheader
113
+ ; LINUX64LE-NEXT: li 6, 0
114
+ ; LINUX64LE-NEXT: cmplwi 5, 1
115
+ ; LINUX64LE-NEXT: beq 0, .LBB0_4
116
+ ; LINUX64LE-NEXT: # %bb.2: # %for.body.preheader.new
117
+ ; LINUX64LE-NEXT: rlwinm 6, 5, 0, 1, 30
118
+ ; LINUX64LE-NEXT: xxspltib 0, 6
119
+ ; LINUX64LE-NEXT: addi 8, 4, -8
120
+ ; LINUX64LE-NEXT: addi 7, 3, -8
121
+ ; LINUX64LE-NEXT: li 9, 8
122
+ ; LINUX64LE-NEXT: li 10, 12
123
+ ; LINUX64LE-NEXT: li 11, 4
124
+ ; LINUX64LE-NEXT: addi 6, 6, -2
125
+ ; LINUX64LE-NEXT: rldicl 6, 6, 63, 1
126
+ ; LINUX64LE-NEXT: addi 6, 6, 1
127
+ ; LINUX64LE-NEXT: mtctr 6
128
+ ; LINUX64LE-NEXT: li 6, 0
129
+ ; LINUX64LE-NEXT: .p2align 4
130
+ ; LINUX64LE-NEXT: .LBB0_3: # %for.body
131
+ ; LINUX64LE-NEXT: #
132
+ ; LINUX64LE-NEXT: lxvwsx 1, 8, 9
133
+ ; LINUX64LE-NEXT: addi 6, 6, 2
134
+ ; LINUX64LE-NEXT: xxland 1, 1, 0
135
+ ; LINUX64LE-NEXT: xxsldwi 1, 1, 1, 3
136
+ ; LINUX64LE-NEXT: xscvspdpn 1, 1
137
+ ; LINUX64LE-NEXT: stfsu 1, 8(7)
138
+ ; LINUX64LE-NEXT: lxvwsx 1, 8, 10
139
+ ; LINUX64LE-NEXT: addi 8, 8, 8
140
+ ; LINUX64LE-NEXT: xxland 1, 1, 0
141
+ ; LINUX64LE-NEXT: stxvrwx 1, 7, 11
142
+ ; LINUX64LE-NEXT: bdnz .LBB0_3
143
+ ; LINUX64LE-NEXT: .LBB0_4: # %for.cond.cleanup.loopexit.unr-lcssa
144
+ ; LINUX64LE-NEXT: andi. 5, 5, 1
145
+ ; LINUX64LE-NEXT: bclr 4, 1, 0
146
+ ; LINUX64LE-NEXT: # %bb.5: # %for.body.epil
147
+ ; LINUX64LE-NEXT: sldi 5, 6, 2
148
+ ; LINUX64LE-NEXT: xxspltib 1, 6
149
+ ; LINUX64LE-NEXT: lxvwsx 0, 4, 5
150
+ ; LINUX64LE-NEXT: xxland 0, 0, 1
151
+ ; LINUX64LE-NEXT: stxvrwx 0, 3, 5
152
+ ; LINUX64LE-NEXT: blr
13
153
entry:
14
154
%0 = load i32 , ptr %n , align 4
15
155
%cmp9 = icmp sgt i32 %0 , 0
16
156
br i1 %cmp9 , label %for.body.preheader , label %for.cond.cleanup
17
157
18
- for.body.preheader:
158
+ for.body.preheader:
19
159
%wide.trip.count = zext nneg i32 %0 to i64
20
160
%xtraiter = and i64 %wide.trip.count , 1
21
161
%1 = icmp eq i32 %0 , 1
22
162
br i1 %1 , label %for.cond.cleanup.loopexit.unr-lcssa , label %for.body.preheader.new
23
163
24
- for.body.preheader.new:
164
+ for.body.preheader.new:
25
165
%unroll_iter = and i64 %wide.trip.count , 2147483646
26
166
br label %for.body
27
167
28
- for.cond.cleanup.loopexit.unr-lcssa:
168
+ for.cond.cleanup.loopexit.unr-lcssa:
29
169
%indvars.iv.unr = phi i64 [ 0 , %for.body.preheader ], [ %indvars.iv.next.1 , %for.body ]
30
170
%lcmp.mod.not = icmp eq i64 %xtraiter , 0
31
171
br i1 %lcmp.mod.not , label %for.cond.cleanup , label %for.body.epil
32
172
33
- for.body.epil:
173
+ for.body.epil:
34
174
%arrayidx.epil = getelementptr inbounds nuw float , ptr %In_a , i64 %indvars.iv.unr
35
175
%2 = load float , ptr %arrayidx.epil , align 4
36
176
%vecins.i.epil = insertelement <4 x float > poison, float %2 , i64 0
@@ -42,10 +182,10 @@ for.body.epil:
42
182
store float %vecext.i.epil , ptr %arrayidx5.epil , align 4
43
183
br label %for.cond.cleanup
44
184
45
- for.cond.cleanup:
185
+ for.cond.cleanup:
46
186
ret void
47
187
48
- for.body:
188
+ for.body:
49
189
%indvars.iv = phi i64 [ 0 , %for.body.preheader.new ], [ %indvars.iv.next.1 , %for.body ]
50
190
%niter = phi i64 [ 0 , %for.body.preheader.new ], [ %niter.next.1 , %for.body ]
51
191
%arrayidx = getelementptr inbounds nuw float , ptr %In_a , i64 %indvars.iv
@@ -72,113 +212,3 @@ for.body:
72
212
%niter.ncmp.1 = icmp eq i64 %niter.next.1 , %unroll_iter
73
213
br i1 %niter.ncmp.1 , label %for.cond.cleanup.loopexit.unr-lcssa , label %for.body
74
214
}
75
-
76
- ; AIX32: ._Z3fooPfS_Pi:
77
- ; AIX32-NEXT: # %bb.0: # %entry
78
- ; AIX32-NEXT: lwz 5, 0(5)
79
- ; AIX32-NEXT: cmpwi 5, 1
80
- ; AIX32-NEXT: bltlr 0
81
- ; AIX32-NEXT: # %bb.1: # %for.body.preheader
82
- ; AIX32-NEXT: li 6, 0
83
- ; AIX32-NEXT: beq 0, L..BB0_4
84
- ; AIX32-NEXT: # %bb.2: # %for.body.preheader.new
85
- ; AIX32-NEXT: xxspltib 0, 6
86
- ; AIX32-NEXT: addi 12, 4, -8
87
- ; AIX32-NEXT: addi 9, 3, -8
88
- ; AIX32-NEXT: rlwinm 7, 5, 0, 1, 30
89
- ; AIX32-NEXT: li 8, 0
90
- ; AIX32-NEXT: li 10, 8
91
- ; AIX32-NEXT: li 11, 12
92
- ; AIX32-NEXT: .align 4
93
- ; AIX32-NEXT: L..BB0_3: # %for.body
94
- ; AIX32-NEXT: # =>This Inner Loop Header: Depth=1
95
- ; AIX32-NEXT: lxvwsx 1, 12, 10
96
- ; AIX32-NEXT: addic 6, 6, 2
97
- ; AIX32-NEXT: addze 8, 8
98
- ; AIX32-NEXT: xor 0, 6, 7
99
- ; AIX32-NEXT: or. 0, 0, 8
100
- ; AIX32-NEXT: xxland 1, 1, 0
101
- ; AIX32-NEXT: xscvspdpn 1, 1
102
- ; AIX32-NEXT: stfsu 1, 8(9)
103
- ; AIX32-NEXT: lxvwsx 1, 12, 11
104
- ; AIX32-NEXT: addi 12, 12, 8
105
- ; AIX32-NEXT: xxland 1, 1, 0
106
- ; AIX32-NEXT: xscvspdpn 1, 1
107
- ; AIX32-NEXT: stfs 1, 4(9)
108
- ; AIX32-NEXT: bne 0, L..BB0_3
109
-
110
- ; AIX64: ._Z3fooPfS_Pi:
111
- ; AIX64-NEXT: # %bb.0: # %entry
112
- ; AIX64-NEXT: lwz 5, 0(5)
113
- ; AIX64-NEXT: cmpwi 5, 1
114
- ; AIX64-NEXT: bltlr 0
115
- ; AIX64-NEXT: # %bb.1: # %for.body.preheader
116
- ; AIX64-NEXT: li 6, 0
117
- ; AIX64-NEXT: cmplwi 5, 1
118
- ; AIX64-NEXT: beq 0, L..BB0_4
119
- ; AIX64-NEXT: # %bb.2: # %for.body.preheader.new
120
- ; AIX64-NEXT: rlwinm 6, 5, 0, 1, 30
121
- ; AIX64-NEXT: xxspltib 0, 6
122
- ; AIX64-NEXT: addi 9, 4, -8
123
- ; AIX64-NEXT: addi 7, 3, -8
124
- ; AIX64-NEXT: li 8, 8
125
- ; AIX64-NEXT: li 10, 12
126
- ; AIX64-NEXT: li 11, 4
127
- ; AIX64-NEXT: addi 6, 6, -2
128
- ; AIX64-NEXT: rldicl 6, 6, 63, 1
129
- ; AIX64-NEXT: addi 6, 6, 1
130
- ; AIX64-NEXT: mtctr 6
131
- ; AIX64-NEXT: li 6, 0
132
- ; AIX64-NEXT: .align 4
133
- ; AIX64-NEXT: L..BB0_3: # %for.body
134
- ; AIX64-NEXT: # =>This Inner Loop Header: Depth=1
135
- ; AIX64-NEXT: lxvwsx 1, 9, 8
136
- ; AIX64-NEXT: addi 6, 6, 2
137
- ; AIX64-NEXT: xxland 1, 1, 0
138
- ; AIX64-NEXT: xscvspdpn 1, 1
139
- ; AIX64-NEXT: stfsu 1, 8(7)
140
- ; AIX64-NEXT: lxvwsx 1, 9, 10
141
- ; AIX64-NEXT: addi 9, 9, 8
142
- ; AIX64-NEXT: xxland 1, 1, 0
143
- ; AIX64-NEXT: xxsldwi 1, 1, 1, 3
144
- ; AIX64-NEXT: stfiwx 1, 7, 11
145
- ; AIX64-NEXT: bdnz L..BB0_3
146
-
147
- ; LINUX64LE: _Z3fooPfS_Pi: # @_Z3fooPfS_Pi
148
- ; LINUX64LE-NEXT: .Lfunc_begin0:
149
- ; LINUX64LE-NEXT: .cfi_startproc
150
- ; LINUX64LE-NEXT: # %bb.0: # %entry
151
- ; LINUX64LE-NEXT: lwz 5, 0(5)
152
- ; LINUX64LE-NEXT: cmpwi 5, 1
153
- ; LINUX64LE-NEXT: bltlr 0
154
- ; LINUX64LE-NEXT: # %bb.1: # %for.body.preheader
155
- ; LINUX64LE-NEXT: li 6, 0
156
- ; LINUX64LE-NEXT: cmplwi 5, 1
157
- ; LINUX64LE-NEXT: beq 0, .LBB0_4
158
- ; LINUX64LE-NEXT: # %bb.2: # %for.body.preheader.new
159
- ; LINUX64LE-NEXT: rlwinm 6, 5, 0, 1, 30
160
- ; LINUX64LE-NEXT: xxspltib 0, 6
161
- ; LINUX64LE-NEXT: addi 8, 4, -8
162
- ; LINUX64LE-NEXT: addi 7, 3, -8
163
- ; LINUX64LE-NEXT: li 9, 8
164
- ; LINUX64LE-NEXT: li 10, 12
165
- ; LINUX64LE-NEXT: li 11, 4
166
- ; LINUX64LE-NEXT: addi 6, 6, -2
167
- ; LINUX64LE-NEXT: rldicl 6, 6, 63, 1
168
- ; LINUX64LE-NEXT: addi 6, 6, 1
169
- ; LINUX64LE-NEXT: mtctr 6
170
- ; LINUX64LE-NEXT: li 6, 0
171
- ; LINUX64LE-NEXT: .p2align 4
172
- ; LINUX64LE-NEXT: .LBB0_3: # %for.body
173
- ; LINUX64LE-NEXT: # =>This Inner Loop Header: Depth=1
174
- ; LINUX64LE-NEXT: lxvwsx 1, 8, 9
175
- ; LINUX64LE-NEXT: addi 6, 6, 2
176
- ; LINUX64LE-NEXT: xxland 1, 1, 0
177
- ; LINUX64LE-NEXT: xxsldwi 1, 1, 1, 3
178
- ; LINUX64LE-NEXT: xscvspdpn 1, 1
179
- ; LINUX64LE-NEXT: stfsu 1, 8(7)
180
- ; LINUX64LE-NEXT: lxvwsx 1, 8, 10
181
- ; LINUX64LE-NEXT: addi 8, 8, 8
182
- ; LINUX64LE-NEXT: xxland 1, 1, 0
183
- ; LINUX64LE-NEXT: stxvrwx 1, 7, 11
184
- ; LINUX64LE-NEXT: bdnz .LBB0_3
0 commit comments