@@ -2161,6 +2161,158 @@ define i1 @mul_nuw_nsw_nonneg_cant_be_one_commuted(i8 %x, i8 %y) {
2161
2161
ret i1 %cmp
2162
2162
}
2163
2163
2164
+ define i8 @test_trunc_and_1 (i8 %a ) {
2165
+ ; CHECK-LABEL: @test_trunc_and_1(
2166
+ ; CHECK-NEXT: entry:
2167
+ ; CHECK-NEXT: [[CAST:%.*]] = trunc i8 [[A:%.*]] to i1
2168
+ ; CHECK-NEXT: br i1 [[CAST]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
2169
+ ; CHECK: if.then:
2170
+ ; CHECK-NEXT: [[B:%.*]] = and i8 [[A]], 1
2171
+ ; CHECK-NEXT: ret i8 [[B]]
2172
+ ; CHECK: if.else:
2173
+ ; CHECK-NEXT: [[C:%.*]] = and i8 [[A]], 1
2174
+ ; CHECK-NEXT: ret i8 [[C]]
2175
+ ;
2176
+ entry:
2177
+ %cast = trunc i8 %a to i1
2178
+ br i1 %cast , label %if.then , label %if.else
2179
+
2180
+ if.then:
2181
+ %b = and i8 %a , 1
2182
+ ret i8 %b
2183
+
2184
+ if.else:
2185
+ %c = and i8 %a , 1
2186
+ ret i8 %c
2187
+ }
2188
+
2189
+ define i8 @test_not_trunc_and_1 (i8 %a ) {
2190
+ ; CHECK-LABEL: @test_not_trunc_and_1(
2191
+ ; CHECK-NEXT: entry:
2192
+ ; CHECK-NEXT: [[CAST:%.*]] = trunc i8 [[A:%.*]] to i1
2193
+ ; CHECK-NEXT: br i1 [[CAST]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
2194
+ ; CHECK: if.then:
2195
+ ; CHECK-NEXT: [[B:%.*]] = and i8 [[A]], 1
2196
+ ; CHECK-NEXT: ret i8 [[B]]
2197
+ ; CHECK: if.else:
2198
+ ; CHECK-NEXT: [[C:%.*]] = and i8 [[A]], 1
2199
+ ; CHECK-NEXT: ret i8 [[C]]
2200
+ ;
2201
+ entry:
2202
+ %cast = trunc i8 %a to i1
2203
+ %not = xor i1 %cast , true
2204
+ br i1 %not , label %if.then , label %if.else
2205
+
2206
+ if.then:
2207
+ %b = and i8 %a , 1
2208
+ ret i8 %b
2209
+
2210
+ if.else:
2211
+ %c = and i8 %a , 1
2212
+ ret i8 %c
2213
+ }
2214
+
2215
+ define i8 @neg_test_trunc_or_2 (i8 %a ) {
2216
+ ; CHECK-LABEL: @neg_test_trunc_or_2(
2217
+ ; CHECK-NEXT: entry:
2218
+ ; CHECK-NEXT: [[CAST:%.*]] = trunc i8 [[A:%.*]] to i1
2219
+ ; CHECK-NEXT: br i1 [[CAST]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
2220
+ ; CHECK: if.then:
2221
+ ; CHECK-NEXT: [[B:%.*]] = or i8 [[A]], 2
2222
+ ; CHECK-NEXT: ret i8 [[B]]
2223
+ ; CHECK: if.else:
2224
+ ; CHECK-NEXT: [[C:%.*]] = or i8 [[A]], 2
2225
+ ; CHECK-NEXT: ret i8 [[C]]
2226
+ ;
2227
+ entry:
2228
+ %cast = trunc i8 %a to i1
2229
+ br i1 %cast , label %if.then , label %if.else
2230
+
2231
+ if.then:
2232
+ %b = or i8 %a , 2
2233
+ ret i8 %b
2234
+
2235
+ if.else:
2236
+ %c = or i8 %a , 2
2237
+ ret i8 %c
2238
+ }
2239
+
2240
+ define i8 @test_trunc_nuw_and_1 (i8 %a ) {
2241
+ ; CHECK-LABEL: @test_trunc_nuw_and_1(
2242
+ ; CHECK-NEXT: entry:
2243
+ ; CHECK-NEXT: [[CAST:%.*]] = trunc nuw i8 [[A:%.*]] to i1
2244
+ ; CHECK-NEXT: br i1 [[CAST]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
2245
+ ; CHECK: if.then:
2246
+ ; CHECK-NEXT: [[B:%.*]] = and i8 [[A]], 1
2247
+ ; CHECK-NEXT: ret i8 [[B]]
2248
+ ; CHECK: if.else:
2249
+ ; CHECK-NEXT: [[C:%.*]] = and i8 [[A]], 1
2250
+ ; CHECK-NEXT: ret i8 [[C]]
2251
+ ;
2252
+ entry:
2253
+ %cast = trunc nuw i8 %a to i1
2254
+ br i1 %cast , label %if.else , label %if.then
2255
+
2256
+ if.then:
2257
+ %b = and i8 %a , 1
2258
+ ret i8 %b
2259
+
2260
+ if.else:
2261
+ %c = and i8 %a , 1
2262
+ ret i8 %c
2263
+ }
2264
+
2265
+ define i8 @test_trunc_nuw_or_2 (i8 %a ) {
2266
+ ; CHECK-LABEL: @test_trunc_nuw_or_2(
2267
+ ; CHECK-NEXT: entry:
2268
+ ; CHECK-NEXT: [[CAST:%.*]] = trunc nuw i8 [[A:%.*]] to i1
2269
+ ; CHECK-NEXT: br i1 [[CAST]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
2270
+ ; CHECK: if.then:
2271
+ ; CHECK-NEXT: [[B:%.*]] = or i8 [[A]], 2
2272
+ ; CHECK-NEXT: ret i8 [[B]]
2273
+ ; CHECK: if.else:
2274
+ ; CHECK-NEXT: [[C:%.*]] = or i8 [[A]], 2
2275
+ ; CHECK-NEXT: ret i8 [[C]]
2276
+ ;
2277
+ entry:
2278
+ %cast = trunc nuw i8 %a to i1
2279
+ br i1 %cast , label %if.else , label %if.then
2280
+
2281
+ if.then:
2282
+ %b = or i8 %a , 2
2283
+ ret i8 %b
2284
+
2285
+ if.else:
2286
+ %c = or i8 %a , 2
2287
+ ret i8 %c
2288
+ }
2289
+
2290
+ define i8 @test_not_trunc_nuw_and_1 (i8 %a ) {
2291
+ ; CHECK-LABEL: @test_not_trunc_nuw_and_1(
2292
+ ; CHECK-NEXT: entry:
2293
+ ; CHECK-NEXT: [[CAST:%.*]] = trunc nuw i8 [[A:%.*]] to i1
2294
+ ; CHECK-NEXT: br i1 [[CAST]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
2295
+ ; CHECK: if.then:
2296
+ ; CHECK-NEXT: [[B:%.*]] = and i8 [[A]], 1
2297
+ ; CHECK-NEXT: ret i8 [[B]]
2298
+ ; CHECK: if.else:
2299
+ ; CHECK-NEXT: [[C:%.*]] = and i8 [[A]], 1
2300
+ ; CHECK-NEXT: ret i8 [[C]]
2301
+ ;
2302
+ entry:
2303
+ %cast = trunc nuw i8 %a to i1
2304
+ %not = xor i1 %cast , true
2305
+ br i1 %not , label %if.then , label %if.else
2306
+
2307
+ if.then:
2308
+ %b = and i8 %a , 1
2309
+ ret i8 %b
2310
+
2311
+ if.else:
2312
+ %c = and i8 %a , 1
2313
+ ret i8 %c
2314
+ }
2315
+
2164
2316
declare void @dummy ()
2165
2317
declare void @use (i1 )
2166
2318
declare void @sink (i8 )
0 commit comments