422 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=instcombine < %s | FileCheck %s3 4declare void @foo()5 6define i1 @test1(i32 %a, i32 %b) {7; CHECK-LABEL: @test1(8; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[A:%.*]], [[B:%.*]]9; CHECK-NEXT: [[OR_COND:%.*]] = icmp slt i32 [[TMP1]], 010; CHECK-NEXT: ret i1 [[OR_COND]]11;12 %1 = icmp slt i32 %a, 013 %2 = icmp slt i32 %b, 014 %or.cond = or i1 %1, %215 ret i1 %or.cond16}17 18define <2 x i1> @test1_splat(<2 x i32> %a, <2 x i32> %b) {19; CHECK-LABEL: @test1_splat(20; CHECK-NEXT: [[TMP1:%.*]] = or <2 x i32> [[A:%.*]], [[B:%.*]]21; CHECK-NEXT: [[OR_COND:%.*]] = icmp slt <2 x i32> [[TMP1]], zeroinitializer22; CHECK-NEXT: ret <2 x i1> [[OR_COND]]23;24 %1 = icmp slt <2 x i32> %a, zeroinitializer25 %2 = icmp slt <2 x i32> %b, zeroinitializer26 %or.cond = or <2 x i1> %1, %227 ret <2 x i1> %or.cond28}29 30define i1 @test1_logical(i32 %a, i32 %b) {31; CHECK-LABEL: @test1_logical(32; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i32 [[A:%.*]], 033; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[B:%.*]], 034; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[TMP1]], i1 true, i1 [[TMP2]]35; CHECK-NEXT: ret i1 [[OR_COND]]36;37 %1 = icmp slt i32 %a, 038 %2 = icmp slt i32 %b, 039 %or.cond = select i1 %1, i1 true, i1 %240 ret i1 %or.cond41}42 43define i1 @test2(i32 %a, i32 %b) {44; CHECK-LABEL: @test2(45; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], [[B:%.*]]46; CHECK-NEXT: [[OR_COND:%.*]] = icmp sgt i32 [[TMP1]], -147; CHECK-NEXT: ret i1 [[OR_COND]]48;49 %1 = icmp sgt i32 %a, -150 %2 = icmp sgt i32 %b, -151 %or.cond = or i1 %1, %252 ret i1 %or.cond53}54 55define i1 @test2_logical(i32 %a, i32 %b) {56; CHECK-LABEL: @test2_logical(57; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i32 [[A:%.*]], -158; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[B:%.*]], -159; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[TMP1]], i1 true, i1 [[TMP2]]60; CHECK-NEXT: ret i1 [[OR_COND]]61;62 %1 = icmp sgt i32 %a, -163 %2 = icmp sgt i32 %b, -164 %or.cond = select i1 %1, i1 true, i1 %265 ret i1 %or.cond66}67 68define i1 @test3(i32 %a, i32 %b) {69; CHECK-LABEL: @test3(70; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], [[B:%.*]]71; CHECK-NEXT: [[OR_COND:%.*]] = icmp slt i32 [[TMP1]], 072; CHECK-NEXT: ret i1 [[OR_COND]]73;74 %1 = icmp slt i32 %a, 075 %2 = icmp slt i32 %b, 076 %or.cond = and i1 %1, %277 ret i1 %or.cond78}79 80define i1 @test3_logical(i32 %a, i32 %b) {81; CHECK-LABEL: @test3_logical(82; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i32 [[A:%.*]], 083; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[B:%.*]], 084; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[TMP1]], i1 [[TMP2]], i1 false85; CHECK-NEXT: ret i1 [[OR_COND]]86;87 %1 = icmp slt i32 %a, 088 %2 = icmp slt i32 %b, 089 %or.cond = select i1 %1, i1 %2, i1 false90 ret i1 %or.cond91}92 93define i1 @test4(i32 %a, i32 %b) {94; CHECK-LABEL: @test4(95; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[A:%.*]], [[B:%.*]]96; CHECK-NEXT: [[OR_COND:%.*]] = icmp sgt i32 [[TMP1]], -197; CHECK-NEXT: ret i1 [[OR_COND]]98;99 %1 = icmp sgt i32 %a, -1100 %2 = icmp sgt i32 %b, -1101 %or.cond = and i1 %1, %2102 ret i1 %or.cond103}104 105define i1 @test4_logical(i32 %a, i32 %b) {106; CHECK-LABEL: @test4_logical(107; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i32 [[A:%.*]], -1108; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[B:%.*]], -1109; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[TMP1]], i1 [[TMP2]], i1 false110; CHECK-NEXT: ret i1 [[OR_COND]]111;112 %1 = icmp sgt i32 %a, -1113 %2 = icmp sgt i32 %b, -1114 %or.cond = select i1 %1, i1 %2, i1 false115 ret i1 %or.cond116}117 118define void @test5(i32 %a) {119; CHECK-LABEL: @test5(120; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920121; CHECK-NEXT: [[OR_COND:%.*]] = icmp eq i32 [[TMP1]], 0122; CHECK-NEXT: br i1 [[OR_COND]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]123; CHECK: if.then:124; CHECK-NEXT: tail call void @foo() #[[ATTR0:[0-9]+]]125; CHECK-NEXT: ret void126; CHECK: if.end:127; CHECK-NEXT: ret void128;129 %and = and i32 %a, 134217728130 %1 = icmp eq i32 %and, 0131 %2 = icmp sgt i32 %a, -1132 %or.cond = and i1 %1, %2133 br i1 %or.cond, label %if.then, label %if.end134 135 136if.then:137 tail call void @foo() nounwind138 ret void139 140if.end:141 ret void142}143 144define void @test5_logical(i32 %a) {145; CHECK-LABEL: @test5_logical(146; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920147; CHECK-NEXT: [[OR_COND:%.*]] = icmp eq i32 [[TMP1]], 0148; CHECK-NEXT: br i1 [[OR_COND]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]149; CHECK: if.then:150; CHECK-NEXT: tail call void @foo() #[[ATTR0]]151; CHECK-NEXT: ret void152; CHECK: if.end:153; CHECK-NEXT: ret void154;155 %and = and i32 %a, 134217728156 %1 = icmp eq i32 %and, 0157 %2 = icmp sgt i32 %a, -1158 %or.cond = select i1 %1, i1 %2, i1 false159 br i1 %or.cond, label %if.then, label %if.end160 161 162if.then:163 tail call void @foo() nounwind164 ret void165 166if.end:167 ret void168}169 170define void @test6(i32 %a) {171; CHECK-LABEL: @test6(172; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920173; CHECK-NEXT: [[OR_COND:%.*]] = icmp eq i32 [[TMP1]], 0174; CHECK-NEXT: br i1 [[OR_COND]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]175; CHECK: if.then:176; CHECK-NEXT: tail call void @foo() #[[ATTR0]]177; CHECK-NEXT: ret void178; CHECK: if.end:179; CHECK-NEXT: ret void180;181 %1 = icmp sgt i32 %a, -1182 %and = and i32 %a, 134217728183 %2 = icmp eq i32 %and, 0184 %or.cond = and i1 %1, %2185 br i1 %or.cond, label %if.then, label %if.end186 187 188if.then:189 tail call void @foo() nounwind190 ret void191 192if.end:193 ret void194}195 196define void @test6_logical(i32 %a) {197; CHECK-LABEL: @test6_logical(198; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920199; CHECK-NEXT: [[OR_COND:%.*]] = icmp eq i32 [[TMP1]], 0200; CHECK-NEXT: br i1 [[OR_COND]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]201; CHECK: if.then:202; CHECK-NEXT: tail call void @foo() #[[ATTR0]]203; CHECK-NEXT: ret void204; CHECK: if.end:205; CHECK-NEXT: ret void206;207 %1 = icmp sgt i32 %a, -1208 %and = and i32 %a, 134217728209 %2 = icmp eq i32 %and, 0210 %or.cond = select i1 %1, i1 %2, i1 false211 br i1 %or.cond, label %if.then, label %if.end212 213 214if.then:215 tail call void @foo() nounwind216 ret void217 218if.end:219 ret void220}221 222define void @test7(i32 %a) {223; CHECK-LABEL: @test7(224; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920225; CHECK-NEXT: [[OR_COND_NOT:%.*]] = icmp eq i32 [[TMP1]], 0226; CHECK-NEXT: br i1 [[OR_COND_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]227; CHECK: if.then:228; CHECK-NEXT: tail call void @foo() #[[ATTR0]]229; CHECK-NEXT: ret void230; CHECK: if.end:231; CHECK-NEXT: ret void232;233 %and = and i32 %a, 134217728234 %1 = icmp ne i32 %and, 0235 %2 = icmp slt i32 %a, 0236 %or.cond = or i1 %1, %2237 br i1 %or.cond, label %if.then, label %if.end238 239 240if.then:241 tail call void @foo() nounwind242 ret void243 244if.end:245 ret void246}247 248define void @test7_logical(i32 %a) {249; CHECK-LABEL: @test7_logical(250; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920251; CHECK-NEXT: [[OR_COND_NOT:%.*]] = icmp eq i32 [[TMP1]], 0252; CHECK-NEXT: br i1 [[OR_COND_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]253; CHECK: if.then:254; CHECK-NEXT: tail call void @foo() #[[ATTR0]]255; CHECK-NEXT: ret void256; CHECK: if.end:257; CHECK-NEXT: ret void258;259 %and = and i32 %a, 134217728260 %1 = icmp ne i32 %and, 0261 %2 = icmp slt i32 %a, 0262 %or.cond = select i1 %1, i1 true, i1 %2263 br i1 %or.cond, label %if.then, label %if.end264 265 266if.then:267 tail call void @foo() nounwind268 ret void269 270if.end:271 ret void272}273 274define void @test8(i32 %a) {275; CHECK-LABEL: @test8(276; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920277; CHECK-NEXT: [[OR_COND_NOT:%.*]] = icmp eq i32 [[TMP1]], 0278; CHECK-NEXT: br i1 [[OR_COND_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]279; CHECK: if.then:280; CHECK-NEXT: tail call void @foo()281; CHECK-NEXT: ret void282; CHECK: if.end:283; CHECK-NEXT: ret void284;285 %1 = icmp slt i32 %a, 0286 %and = and i32 %a, 134217728287 %2 = icmp ne i32 %and, 0288 %or.cond = or i1 %1, %2289 br i1 %or.cond, label %if.then, label %if.end290 291 292if.then:293 tail call void @foo()294 ret void295 296if.end:297 ret void298}299 300define void @test8_logical(i32 %a) {301; CHECK-LABEL: @test8_logical(302; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920303; CHECK-NEXT: [[OR_COND_NOT:%.*]] = icmp eq i32 [[TMP1]], 0304; CHECK-NEXT: br i1 [[OR_COND_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]305; CHECK: if.then:306; CHECK-NEXT: tail call void @foo()307; CHECK-NEXT: ret void308; CHECK: if.end:309; CHECK-NEXT: ret void310;311 %1 = icmp slt i32 %a, 0312 %and = and i32 %a, 134217728313 %2 = icmp ne i32 %and, 0314 %or.cond = select i1 %1, i1 true, i1 %2315 br i1 %or.cond, label %if.then, label %if.end316 317 318if.then:319 tail call void @foo()320 ret void321 322if.end:323 ret void324}325 326define i1 @test9(i32 %a) {327; CHECK-LABEL: @test9(328; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -1073741824329; CHECK-NEXT: [[OR_COND:%.*]] = icmp eq i32 [[TMP1]], 1073741824330; CHECK-NEXT: ret i1 [[OR_COND]]331;332 %1 = and i32 %a, 1073741824333 %2 = icmp ne i32 %1, 0334 %3 = icmp sgt i32 %a, -1335 %or.cond = and i1 %2, %3336 ret i1 %or.cond337}338 339define i1 @test9_logical(i32 %a) {340; CHECK-LABEL: @test9_logical(341; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -1073741824342; CHECK-NEXT: [[OR_COND:%.*]] = icmp eq i32 [[TMP1]], 1073741824343; CHECK-NEXT: ret i1 [[OR_COND]]344;345 %1 = and i32 %a, 1073741824346 %2 = icmp ne i32 %1, 0347 %3 = icmp sgt i32 %a, -1348 %or.cond = select i1 %2, i1 %3, i1 false349 ret i1 %or.cond350}351 352define i1 @test9_logical_samesign(i32 %a) {353; CHECK-LABEL: @test9_logical_samesign(354; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[A:%.*]], -1355; CHECK-NEXT: ret i1 [[CMP2]]356;357 %masked = and i32 %a, -1073741825358 %cmp1 = icmp eq i32 %masked, 0359 %cmp2 = icmp samesign sgt i32 %a, -1360 %or.cond = select i1 %cmp1, i1 true, i1 %cmp2361 ret i1 %or.cond362}363 364define i1 @test_logical_or_icmp_icmp_samesign(i32 %a) {365; CHECK-LABEL: @test_logical_or_icmp_icmp_samesign(366; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[A:%.*]], -1367; CHECK-NEXT: ret i1 [[CMP2]]368;369 %cmp1 = icmp eq i32 %a, 0370 %cmp2 = icmp samesign sgt i32 %a, -1371 %or = select i1 %cmp1, i1 true, i1 %cmp2372 ret i1 %or373}374 375define i1 @test10(i32 %a) {376; CHECK-LABEL: @test10(377; CHECK-NEXT: [[OR_COND:%.*]] = icmp ult i32 [[A:%.*]], 2378; CHECK-NEXT: ret i1 [[OR_COND]]379;380 %1 = and i32 %a, 2381 %2 = icmp eq i32 %1, 0382 %3 = icmp ult i32 %a, 4383 %or.cond = and i1 %2, %3384 ret i1 %or.cond385}386 387define i1 @test10_logical(i32 %a) {388; CHECK-LABEL: @test10_logical(389; CHECK-NEXT: [[OR_COND:%.*]] = icmp ult i32 [[A:%.*]], 2390; CHECK-NEXT: ret i1 [[OR_COND]]391;392 %1 = and i32 %a, 2393 %2 = icmp eq i32 %1, 0394 %3 = icmp ult i32 %a, 4395 %or.cond = select i1 %2, i1 %3, i1 false396 ret i1 %or.cond397}398 399define i1 @test11(i32 %a) {400; CHECK-LABEL: @test11(401; CHECK-NEXT: [[OR_COND:%.*]] = icmp ugt i32 [[A:%.*]], 1402; CHECK-NEXT: ret i1 [[OR_COND]]403;404 %1 = and i32 %a, 2405 %2 = icmp ne i32 %1, 0406 %3 = icmp ugt i32 %a, 3407 %or.cond = or i1 %2, %3408 ret i1 %or.cond409}410 411define i1 @test11_logical(i32 %a) {412; CHECK-LABEL: @test11_logical(413; CHECK-NEXT: [[OR_COND:%.*]] = icmp ugt i32 [[A:%.*]], 1414; CHECK-NEXT: ret i1 [[OR_COND]]415;416 %1 = and i32 %a, 2417 %2 = icmp ne i32 %1, 0418 %3 = icmp ugt i32 %a, 3419 %or.cond = select i1 %2, i1 true, i1 %3420 ret i1 %or.cond421}422