@@ -18,27 +18,38 @@ define i32 @src(i32 %0, i32 %1) {
18
18
ret i32 %6
19
19
}
20
20
21
- ; (x & y) + ~(x | y)
22
- define i32 @src_thwart (i32 %0 , i32 %1 ) {
23
- ; CHECK-LABEL: @src_thwart(
24
- ; CHECK-NEXT: [[X:%.*]] = sdiv i32 42, [[TMP0:%.*]]
25
- ; CHECK-NEXT: [[Y:%.*]] = sdiv i32 43, [[TMP1:%.*]]
26
- ; CHECK-NEXT: [[TMP3:%.*]] = and i32 [[Y]], [[X]]
27
- ; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[Y]], [[X]]
28
- ; CHECK-NEXT: [[TMP5:%.*]] = xor i32 [[TMP4]], -1
29
- ; CHECK-NEXT: [[TMP6:%.*]] = add i32 [[TMP3]], [[TMP5]]
30
- ; CHECK-NEXT: ret i32 [[TMP6]]
31
- ;
32
- %x = sdiv i32 42 , %0 ; thwart complexity-based canonicalization
33
- %y = sdiv i32 43 , %1 ; thwart complexity-based canonicalization
34
- %3 = and i32 %y , %x
35
- %4 = or i32 %y , %x
36
- %5 = xor i32 %4 , -1
37
- %6 = add i32 %3 , %5
38
- ret i32 %6
21
+ ; vector version of src
22
+ define <2 x i32 > @src_vec (<2 x i32 > %0 , <2 x i32 > %1 ) {
23
+ ; CHECK-LABEL: @src_vec(
24
+ ; CHECK-NEXT: [[TMP3:%.*]] = and <2 x i32> [[TMP1:%.*]], [[TMP0:%.*]]
25
+ ; CHECK-NEXT: [[TMP4:%.*]] = or <2 x i32> [[TMP1]], [[TMP0]]
26
+ ; CHECK-NEXT: [[TMP5:%.*]] = xor <2 x i32> [[TMP4]], <i32 -1, i32 -1>
27
+ ; CHECK-NEXT: [[TMP6:%.*]] = add <2 x i32> [[TMP3]], [[TMP5]]
28
+ ; CHECK-NEXT: ret <2 x i32> [[TMP6]]
29
+ ;
30
+ %3 = and <2 x i32 > %1 , %0
31
+ %4 = or <2 x i32 > %1 , %0
32
+ %5 = xor <2 x i32 > %4 , <i32 -1 , i32 -1 >
33
+ %6 = add <2 x i32 > %3 , %5
34
+ ret <2 x i32 > %6
35
+ }
36
+
37
+ ; vector version of src with undef values
38
+ define <2 x i32 > @src_vec_undef (<2 x i32 > %0 , <2 x i32 > %1 ) {
39
+ ; CHECK-LABEL: @src_vec_undef(
40
+ ; CHECK-NEXT: [[TMP3:%.*]] = and <2 x i32> [[TMP1:%.*]], [[TMP0:%.*]]
41
+ ; CHECK-NEXT: [[TMP4:%.*]] = or <2 x i32> [[TMP1]], [[TMP0]]
42
+ ; CHECK-NEXT: [[TMP5:%.*]] = xor <2 x i32> [[TMP4]], <i32 -1, i32 undef>
43
+ ; CHECK-NEXT: [[TMP6:%.*]] = add <2 x i32> [[TMP3]], [[TMP5]]
44
+ ; CHECK-NEXT: ret <2 x i32> [[TMP6]]
45
+ ;
46
+ %3 = and <2 x i32 > %1 , %0
47
+ %4 = or <2 x i32 > %1 , %0
48
+ %5 = xor <2 x i32 > %4 , <i32 -1 , i32 undef >
49
+ %6 = add <2 x i32 > %3 , %5
50
+ ret <2 x i32 > %6
39
51
}
40
52
41
-
42
53
; (x & y) + ~(y | x)
43
54
define i32 @src2 (i32 %0 , i32 %1 ) {
44
55
; CHECK-LABEL: @src2(
@@ -55,26 +66,6 @@ define i32 @src2(i32 %0, i32 %1) {
55
66
ret i32 %6
56
67
}
57
68
58
- ; (x & y) + ~(y | x)
59
- define i32 @src2_thwart (i32 %0 , i32 %1 ) {
60
- ; CHECK-LABEL: @src2_thwart(
61
- ; CHECK-NEXT: [[X:%.*]] = sdiv i32 42, [[TMP0:%.*]]
62
- ; CHECK-NEXT: [[Y:%.*]] = sdiv i32 43, [[TMP1:%.*]]
63
- ; CHECK-NEXT: [[TMP3:%.*]] = and i32 [[Y]], [[X]]
64
- ; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[X]], [[Y]]
65
- ; CHECK-NEXT: [[TMP5:%.*]] = xor i32 [[TMP4]], -1
66
- ; CHECK-NEXT: [[TMP6:%.*]] = add i32 [[TMP3]], [[TMP5]]
67
- ; CHECK-NEXT: ret i32 [[TMP6]]
68
- ;
69
- %x = sdiv i32 42 , %0 ; thwart complexity-based canonicalization
70
- %y = sdiv i32 43 , %1 ; thwart complexity-based canonicalization
71
- %3 = and i32 %y , %x
72
- %4 = or i32 %x , %y
73
- %5 = xor i32 %4 , -1
74
- %6 = add i32 %3 , %5
75
- ret i32 %6
76
- }
77
-
78
69
; (x & y) + (~x & ~y)
79
70
define i32 @src3 (i32 %0 , i32 %1 ) {
80
71
; CHECK-LABEL: @src3(
@@ -92,27 +83,6 @@ define i32 @src3(i32 %0, i32 %1) {
92
83
ret i32 %7
93
84
}
94
85
95
- ; (x & y) + (~x & ~y)
96
- define i32 @src3_thwart (i32 %0 , i32 %1 ) {
97
- ; CHECK-LABEL: @src3_thwart(
98
- ; CHECK-NEXT: [[X:%.*]] = sdiv i32 42, [[TMP0:%.*]]
99
- ; CHECK-NEXT: [[Y:%.*]] = sdiv i32 43, [[TMP1:%.*]]
100
- ; CHECK-NEXT: [[TMP3:%.*]] = and i32 [[Y]], [[X]]
101
- ; CHECK-NEXT: [[DOTDEMORGAN:%.*]] = or i32 [[X]], [[Y]]
102
- ; CHECK-NEXT: [[TMP4:%.*]] = xor i32 [[DOTDEMORGAN]], -1
103
- ; CHECK-NEXT: [[TMP5:%.*]] = add i32 [[TMP3]], [[TMP4]]
104
- ; CHECK-NEXT: ret i32 [[TMP5]]
105
- ;
106
- %x = sdiv i32 42 , %0 ; thwart complexity-based canonicalization
107
- %y = sdiv i32 43 , %1 ; thwart complexity-based canonicalization
108
- %3 = and i32 %y , %x
109
- %4 = xor i32 %x , -1
110
- %5 = xor i32 %y , -1
111
- %6 = and i32 %4 , %5
112
- %7 = add i32 %3 , %6
113
- ret i32 %7
114
- }
115
-
116
86
; ~(x | y) + (y & x)
117
87
define i32 @src4 (i32 %0 , i32 %1 ) {
118
88
; CHECK-LABEL: @src4(
@@ -129,26 +99,6 @@ define i32 @src4(i32 %0, i32 %1) {
129
99
ret i32 %6
130
100
}
131
101
132
- ; ~(x | y) + (y & x)
133
- define i32 @src4_thwart (i32 %0 , i32 %1 ) {
134
- ; CHECK-LABEL: @src4_thwart(
135
- ; CHECK-NEXT: [[X:%.*]] = sdiv i32 42, [[TMP0:%.*]]
136
- ; CHECK-NEXT: [[Y:%.*]] = sdiv i32 43, [[TMP1:%.*]]
137
- ; CHECK-NEXT: [[TMP3:%.*]] = and i32 [[X]], [[Y]]
138
- ; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[Y]], [[X]]
139
- ; CHECK-NEXT: [[TMP5:%.*]] = xor i32 [[TMP4]], -1
140
- ; CHECK-NEXT: [[TMP6:%.*]] = add i32 [[TMP3]], [[TMP5]]
141
- ; CHECK-NEXT: ret i32 [[TMP6]]
142
- ;
143
- %x = sdiv i32 42 , %0 ; thwart complexity-based canonicalization
144
- %y = sdiv i32 43 , %1 ; thwart complexity-based canonicalization
145
- %3 = and i32 %x , %y
146
- %4 = or i32 %y , %x
147
- %5 = xor i32 %4 , -1
148
- %6 = add i32 %3 , %5
149
- ret i32 %6
150
- }
151
-
152
102
; ~(x | y) + (x & y)
153
103
define i32 @src5 (i32 %0 , i32 %1 ) {
154
104
; CHECK-LABEL: @src5(
@@ -165,122 +115,9 @@ define i32 @src5(i32 %0, i32 %1) {
165
115
ret i32 %6
166
116
}
167
117
168
- ; ~(x | y) + (x & y)
169
- define i32 @src5_thwart (i32 %0 , i32 %1 ) {
170
- ; CHECK-LABEL: @src5_thwart(
171
- ; CHECK-NEXT: [[X:%.*]] = sdiv i32 42, [[TMP0:%.*]]
172
- ; CHECK-NEXT: [[Y:%.*]] = sdiv i32 43, [[TMP1:%.*]]
173
- ; CHECK-NEXT: [[TMP3:%.*]] = or i32 [[Y]], [[X]]
174
- ; CHECK-NEXT: [[TMP4:%.*]] = xor i32 [[TMP3]], -1
175
- ; CHECK-NEXT: [[TMP5:%.*]] = and i32 [[Y]], [[X]]
176
- ; CHECK-NEXT: [[TMP6:%.*]] = add i32 [[TMP5]], [[TMP4]]
177
- ; CHECK-NEXT: ret i32 [[TMP6]]
178
- ;
179
- %x = sdiv i32 42 , %0 ; thwart complexity-based canonicalization
180
- %y = sdiv i32 43 , %1 ; thwart complexity-based canonicalization
181
- %3 = or i32 %y , %x
182
- %4 = xor i32 %3 , -1
183
- %5 = and i32 %y , %x
184
- %6 = add i32 %4 , %5
185
- ret i32 %6
186
- }
187
-
188
- ; (x & y) + (~x & ~y)
189
- define i32 @src6 (i32 %0 , i32 %1 ) {
190
- ; CHECK-LABEL: @src6(
191
- ; CHECK-NEXT: [[DOTDEMORGAN:%.*]] = or i32 [[TMP0:%.*]], [[TMP1:%.*]]
192
- ; CHECK-NEXT: [[TMP3:%.*]] = xor i32 [[DOTDEMORGAN]], -1
193
- ; CHECK-NEXT: [[TMP4:%.*]] = and i32 [[TMP1]], [[TMP0]]
194
- ; CHECK-NEXT: [[TMP5:%.*]] = add i32 [[TMP4]], [[TMP3]]
195
- ; CHECK-NEXT: ret i32 [[TMP5]]
196
- ;
197
- %3 = xor i32 %0 , -1
198
- %4 = xor i32 %1 , -1
199
- %5 = and i32 %3 , %4
200
- %6 = and i32 %1 , %0
201
- %7 = add i32 %5 , %6
202
- ret i32 %7
203
- }
204
-
205
- ; (x & y) + (~x & ~y)
206
- define i32 @src6_thwart (i32 %0 , i32 %1 ) {
207
- ; CHECK-LABEL: @src6_thwart(
208
- ; CHECK-NEXT: [[X:%.*]] = sdiv i32 42, [[TMP0:%.*]]
209
- ; CHECK-NEXT: [[Y:%.*]] = sdiv i32 43, [[TMP1:%.*]]
210
- ; CHECK-NEXT: [[DOTDEMORGAN:%.*]] = or i32 [[X]], [[Y]]
211
- ; CHECK-NEXT: [[TMP3:%.*]] = xor i32 [[DOTDEMORGAN]], -1
212
- ; CHECK-NEXT: [[TMP4:%.*]] = and i32 [[Y]], [[X]]
213
- ; CHECK-NEXT: [[TMP5:%.*]] = add i32 [[TMP4]], [[TMP3]]
214
- ; CHECK-NEXT: ret i32 [[TMP5]]
215
- ;
216
- %x = sdiv i32 42 , %0 ; thwart complexity-based canonicalization
217
- %y = sdiv i32 43 , %1 ; thwart complexity-based canonicalization
218
- %3 = xor i32 %x , -1
219
- %4 = xor i32 %y , -1
220
- %5 = and i32 %3 , %4
221
- %6 = and i32 %y , %x
222
- %7 = add i32 %5 , %6
223
- ret i32 %7
224
- }
225
-
226
- ; vector version of src6
227
- define <2 x i32 > @src6_vec (<2 x i32 > %0 , <2 x i32 > %1 ) {
228
- ; CHECK-LABEL: @src6_vec(
229
- ; CHECK-NEXT: [[DOTDEMORGAN:%.*]] = or <2 x i32> [[TMP0:%.*]], [[TMP1:%.*]]
230
- ; CHECK-NEXT: [[TMP3:%.*]] = xor <2 x i32> [[DOTDEMORGAN]], <i32 -1, i32 -1>
231
- ; CHECK-NEXT: [[TMP4:%.*]] = and <2 x i32> [[TMP1]], [[TMP0]]
232
- ; CHECK-NEXT: [[TMP5:%.*]] = add <2 x i32> [[TMP4]], [[TMP3]]
233
- ; CHECK-NEXT: ret <2 x i32> [[TMP5]]
234
- ;
235
- %3 = xor <2 x i32 > %0 , <i32 -1 , i32 -1 >
236
- %4 = xor <2 x i32 > %1 , <i32 -1 , i32 -1 >
237
- %5 = and <2 x i32 > %3 , %4
238
- %6 = and <2 x i32 > %1 , %0
239
- %7 = add <2 x i32 > %5 , %6
240
- ret <2 x i32 > %7
241
- }
242
-
243
- ; check the transformation is still valid with undef
244
- define <2 x i32 > @src6_vec_undef (<2 x i32 > %0 , <2 x i32 > %1 ) {
245
- ; CHECK-LABEL: @src6_vec_undef(
246
- ; CHECK-NEXT: [[DOTDEMORGAN:%.*]] = or <2 x i32> [[TMP0:%.*]], [[TMP1:%.*]]
247
- ; CHECK-NEXT: [[TMP3:%.*]] = xor <2 x i32> [[DOTDEMORGAN]], <i32 -1, i32 -1>
248
- ; CHECK-NEXT: [[TMP4:%.*]] = and <2 x i32> [[TMP1]], [[TMP0]]
249
- ; CHECK-NEXT: [[TMP5:%.*]] = add <2 x i32> [[TMP4]], [[TMP3]]
250
- ; CHECK-NEXT: ret <2 x i32> [[TMP5]]
251
- ;
252
- %3 = xor <2 x i32 > %0 , <i32 -1 , i32 undef >
253
- %4 = xor <2 x i32 > %1 , <i32 -1 , i32 -1 >
254
- %5 = and <2 x i32 > %3 , %4
255
- %6 = and <2 x i32 > %1 , %0
256
- %7 = add <2 x i32 > %5 , %6
257
- ret <2 x i32 > %7
258
- }
259
-
260
- ; vector version of src6 with thwart complexity-based canonicalization
261
- define <2 x i32 > @src6_vec_thwart (<2 x i32 > %0 , <2 x i32 > %1 ) {
262
- ; CHECK-LABEL: @src6_vec_thwart(
263
- ; CHECK-NEXT: [[X:%.*]] = sdiv <2 x i32> <i32 42, i32 43>, [[TMP0:%.*]]
264
- ; CHECK-NEXT: [[Y:%.*]] = sdiv <2 x i32> <i32 43, i32 42>, [[TMP1:%.*]]
265
- ; CHECK-NEXT: [[DOTDEMORGAN:%.*]] = or <2 x i32> [[X]], [[Y]]
266
- ; CHECK-NEXT: [[TMP3:%.*]] = xor <2 x i32> [[DOTDEMORGAN]], <i32 -1, i32 -1>
267
- ; CHECK-NEXT: [[TMP4:%.*]] = and <2 x i32> [[Y]], [[X]]
268
- ; CHECK-NEXT: [[TMP5:%.*]] = add <2 x i32> [[TMP4]], [[TMP3]]
269
- ; CHECK-NEXT: ret <2 x i32> [[TMP5]]
270
- ;
271
- %x = sdiv <2 x i32 > <i32 42 , i32 43 >, %0 ; thwart complexity-based canonicalization
272
- %y = sdiv <2 x i32 > <i32 43 , i32 42 >, %1 ; thwart complexity-based canonicalization
273
- %3 = xor <2 x i32 > %x , <i32 -1 , i32 -1 >
274
- %4 = xor <2 x i32 > %y , <i32 -1 , i32 -1 >
275
- %5 = and <2 x i32 > %3 , %4
276
- %6 = and <2 x i32 > %y , %x
277
- %7 = add <2 x i32 > %5 , %6
278
- ret <2 x i32 > %7
279
- }
280
-
281
118
; (a & b) + ~(c | d)
282
- define i32 @src7 (i32 %0 , i32 %1 , i32 %2 , i32 %3 ) {
283
- ; CHECK-LABEL: @src7 (
119
+ define i32 @src6 (i32 %0 , i32 %1 , i32 %2 , i32 %3 ) {
120
+ ; CHECK-LABEL: @src6 (
284
121
; CHECK-NEXT: [[TMP5:%.*]] = and i32 [[TMP0:%.*]], [[TMP1:%.*]]
285
122
; CHECK-NEXT: [[TMP6:%.*]] = or i32 [[TMP2:%.*]], [[TMP3:%.*]]
286
123
; CHECK-NEXT: [[TMP7:%.*]] = xor i32 [[TMP6]], -1
0 commit comments