@@ -1302,9 +1302,9 @@ define i1 @lshr_neg_sgt_zero(i8 %x) {
13021302
13031303define i1 @exactly_one_set_signbit (i8 %x , i8 %y ) {
13041304; CHECK-LABEL: @exactly_one_set_signbit(
1305- ; CHECK-NEXT: [[XOR_SIGNBITS :%.*]] = xor i8 [[X:%.*]], [[Y:%.*]]
1306- ; CHECK-NEXT: [[R :%.*]] = icmp slt i8 [[XOR_SIGNBITS ]], 0
1307- ; CHECK-NEXT: ret i1 [[R ]]
1305+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i8 [[X:%.*]], [[Y:%.*]]
1306+ ; CHECK-NEXT: [[TMP2 :%.*]] = icmp slt i8 [[TMP1 ]], 0
1307+ ; CHECK-NEXT: ret i1 [[TMP2 ]]
13081308;
13091309 %xsign = lshr i8 %x , 7
13101310 %ypos = icmp sgt i8 %y , -1
@@ -1317,9 +1317,9 @@ define i1 @exactly_one_set_signbit_use1(i8 %x, i8 %y) {
13171317; CHECK-LABEL: @exactly_one_set_signbit_use1(
13181318; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
13191319; CHECK-NEXT: call void @use(i8 [[XSIGN]])
1320- ; CHECK-NEXT: [[XOR_SIGNBITS :%.*]] = xor i8 [[X]], [[Y:%.*]]
1321- ; CHECK-NEXT: [[R :%.*]] = icmp slt i8 [[XOR_SIGNBITS ]], 0
1322- ; CHECK-NEXT: ret i1 [[R ]]
1320+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i8 [[X]], [[Y:%.*]]
1321+ ; CHECK-NEXT: [[TMP2 :%.*]] = icmp slt i8 [[TMP1 ]], 0
1322+ ; CHECK-NEXT: ret i1 [[TMP2 ]]
13231323;
13241324 %xsign = lshr i8 %x , 7
13251325 call void @use (i8 %xsign )
@@ -1331,9 +1331,9 @@ define i1 @exactly_one_set_signbit_use1(i8 %x, i8 %y) {
13311331
13321332define <2 x i1 > @same_signbit (<2 x i8 > %x , <2 x i8 > %y ) {
13331333; CHECK-LABEL: @same_signbit(
1334- ; CHECK-NEXT: [[XOR_SIGNBITS :%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]]
1335- ; CHECK-NEXT: [[R :%.*]] = icmp sgt <2 x i8> [[XOR_SIGNBITS ]], <i8 -1, i8 -1>
1336- ; CHECK-NEXT: ret <2 x i1> [[R ]]
1334+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]]
1335+ ; CHECK-NEXT: [[R1 :%.*]] = icmp sgt <2 x i8> [[TMP1 ]], <i8 -1, i8 -1>
1336+ ; CHECK-NEXT: ret <2 x i1> [[R1 ]]
13371337;
13381338 %xsign = lshr <2 x i8 > %x , <i8 7 , i8 7 >
13391339 %ypos = icmp sgt <2 x i8 > %y , <i8 -1 , i8 -1 >
@@ -1347,9 +1347,9 @@ define i1 @same_signbit_use2(i8 %x, i8 %y) {
13471347; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
13481348; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
13491349; CHECK-NEXT: call void @use(i8 [[YPOSZ]])
1350- ; CHECK-NEXT: [[XOR_SIGNBITS :%.*]] = xor i8 [[X:%.*]], [[Y]]
1351- ; CHECK-NEXT: [[R :%.*]] = icmp sgt i8 [[XOR_SIGNBITS ]], -1
1352- ; CHECK-NEXT: ret i1 [[R ]]
1350+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i8 [[X:%.*]], [[Y]]
1351+ ; CHECK-NEXT: [[R1 :%.*]] = icmp sgt i8 [[TMP1 ]], -1
1352+ ; CHECK-NEXT: ret i1 [[R1 ]]
13531353;
13541354 %xsign = lshr i8 %x , 7
13551355 %ypos = icmp sgt i8 %y , -1
@@ -1382,9 +1382,10 @@ define i1 @same_signbit_use3(i8 %x, i8 %y) {
13821382
13831383define <2 x i1 > @same_signbit_poison_elts (<2 x i8 > %x , <2 x i8 > %y ) {
13841384; CHECK-LABEL: @same_signbit_poison_elts(
1385- ; CHECK-NEXT: [[XOR_SIGNBITS:%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]]
1386- ; CHECK-NEXT: [[R:%.*]] = icmp sgt <2 x i8> [[XOR_SIGNBITS]], <i8 -1, i8 -1>
1387- ; CHECK-NEXT: ret <2 x i1> [[R]]
1385+ ; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt <2 x i8> [[Y:%.*]], <i8 -1, i8 poison>
1386+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp slt <2 x i8> [[X:%.*]], zeroinitializer
1387+ ; CHECK-NEXT: [[R1:%.*]] = xor <2 x i1> [[TMP1]], [[YPOS]]
1388+ ; CHECK-NEXT: ret <2 x i1> [[R1]]
13881389;
13891390 %xsign = lshr <2 x i8 > %x , <i8 7 , i8 poison>
13901391 %ypos = icmp sgt <2 x i8 > %y , <i8 -1 , i8 poison>
@@ -1397,11 +1398,10 @@ define <2 x i1> @same_signbit_poison_elts(<2 x i8> %x, <2 x i8> %y) {
13971398
13981399define i1 @same_signbit_wrong_type (i8 %x , i32 %y ) {
13991400; CHECK-LABEL: @same_signbit_wrong_type(
1400- ; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
14011401; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i32 [[Y:%.*]], -1
1402- ; CHECK-NEXT: [[YPOSZ :%.*]] = zext i1 [[YPOS]] to i8
1403- ; CHECK-NEXT: [[R :%.*]] = icmp ne i8 [[XSIGN ]], [[YPOSZ ]]
1404- ; CHECK-NEXT: ret i1 [[R ]]
1402+ ; CHECK-NEXT: [[TMP1 :%.*]] = icmp slt i8 [[X:%.*]], 0
1403+ ; CHECK-NEXT: [[R1 :%.*]] = xor i1 [[TMP1 ]], [[YPOS ]]
1404+ ; CHECK-NEXT: ret i1 [[R1 ]]
14051405;
14061406 %xsign = lshr i8 %x , 7
14071407 %ypos = icmp sgt i32 %y , -1
@@ -1450,11 +1450,9 @@ define i1 @exactly_one_set_signbit_wrong_shr(i8 %x, i8 %y) {
14501450
14511451define i1 @exactly_one_set_signbit_wrong_pred (i8 %x , i8 %y ) {
14521452; CHECK-LABEL: @exactly_one_set_signbit_wrong_pred(
1453- ; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
1454- ; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1455- ; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
1456- ; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[XSIGN]], [[YPOSZ]]
1457- ; CHECK-NEXT: ret i1 [[R]]
1453+ ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[Y:%.*]], [[X:%.*]]
1454+ ; CHECK-NEXT: [[R1:%.*]] = icmp slt i8 [[TMP1]], 0
1455+ ; CHECK-NEXT: ret i1 [[R1]]
14581456;
14591457 %xsign = lshr i8 %x , 7
14601458 %ypos = icmp sgt i8 %y , -1
@@ -1465,9 +1463,9 @@ define i1 @exactly_one_set_signbit_wrong_pred(i8 %x, i8 %y) {
14651463
14661464define i1 @exactly_one_set_signbit_signed (i8 %x , i8 %y ) {
14671465; CHECK-LABEL: @exactly_one_set_signbit_signed(
1468- ; CHECK-NEXT: [[XOR_SIGNBITS :%.*]] = xor i8 [[X:%.*]], [[Y:%.*]]
1469- ; CHECK-NEXT: [[R :%.*]] = icmp slt i8 [[XOR_SIGNBITS ]], 0
1470- ; CHECK-NEXT: ret i1 [[R ]]
1466+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i8 [[X:%.*]], [[Y:%.*]]
1467+ ; CHECK-NEXT: [[TMP2 :%.*]] = icmp slt i8 [[TMP1 ]], 0
1468+ ; CHECK-NEXT: ret i1 [[TMP2 ]]
14711469;
14721470 %xsign = ashr i8 %x , 7
14731471 %ypos = icmp sgt i8 %y , -1
@@ -1480,9 +1478,9 @@ define i1 @exactly_one_set_signbit_use1_signed(i8 %x, i8 %y) {
14801478; CHECK-LABEL: @exactly_one_set_signbit_use1_signed(
14811479; CHECK-NEXT: [[XSIGN:%.*]] = ashr i8 [[X:%.*]], 7
14821480; CHECK-NEXT: call void @use(i8 [[XSIGN]])
1483- ; CHECK-NEXT: [[XOR_SIGNBITS :%.*]] = xor i8 [[X]], [[Y:%.*]]
1484- ; CHECK-NEXT: [[R :%.*]] = icmp slt i8 [[XOR_SIGNBITS ]], 0
1485- ; CHECK-NEXT: ret i1 [[R ]]
1481+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i8 [[X]], [[Y:%.*]]
1482+ ; CHECK-NEXT: [[TMP2 :%.*]] = icmp slt i8 [[TMP1 ]], 0
1483+ ; CHECK-NEXT: ret i1 [[TMP2 ]]
14861484;
14871485 %xsign = ashr i8 %x , 7
14881486 call void @use (i8 %xsign )
@@ -1494,9 +1492,9 @@ define i1 @exactly_one_set_signbit_use1_signed(i8 %x, i8 %y) {
14941492
14951493define <2 x i1 > @same_signbit_signed (<2 x i8 > %x , <2 x i8 > %y ) {
14961494; CHECK-LABEL: @same_signbit_signed(
1497- ; CHECK-NEXT: [[XOR_SIGNBITS :%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]]
1498- ; CHECK-NEXT: [[R :%.*]] = icmp sgt <2 x i8> [[XOR_SIGNBITS ]], <i8 -1, i8 -1>
1499- ; CHECK-NEXT: ret <2 x i1> [[R ]]
1495+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]]
1496+ ; CHECK-NEXT: [[R1 :%.*]] = icmp sgt <2 x i8> [[TMP1 ]], <i8 -1, i8 -1>
1497+ ; CHECK-NEXT: ret <2 x i1> [[R1 ]]
15001498;
15011499 %xsign = ashr <2 x i8 > %x , <i8 7 , i8 7 >
15021500 %ypos = icmp sgt <2 x i8 > %y , <i8 -1 , i8 -1 >
@@ -1510,9 +1508,9 @@ define i1 @same_signbit_use2_signed(i8 %x, i8 %y) {
15101508; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
15111509; CHECK-NEXT: [[YPOSZ:%.*]] = sext i1 [[YPOS]] to i8
15121510; CHECK-NEXT: call void @use(i8 [[YPOSZ]])
1513- ; CHECK-NEXT: [[XOR_SIGNBITS :%.*]] = xor i8 [[X:%.*]], [[Y]]
1514- ; CHECK-NEXT: [[R :%.*]] = icmp sgt i8 [[XOR_SIGNBITS ]], -1
1515- ; CHECK-NEXT: ret i1 [[R ]]
1511+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i8 [[X:%.*]], [[Y]]
1512+ ; CHECK-NEXT: [[R1 :%.*]] = icmp sgt i8 [[TMP1 ]], -1
1513+ ; CHECK-NEXT: ret i1 [[R1 ]]
15161514;
15171515 %xsign = ashr i8 %x , 7
15181516 %ypos = icmp sgt i8 %y , -1
@@ -1545,9 +1543,10 @@ define i1 @same_signbit_use3_signed(i8 %x, i8 %y) {
15451543
15461544define <2 x i1 > @same_signbit_poison_elts_signed (<2 x i8 > %x , <2 x i8 > %y ) {
15471545; CHECK-LABEL: @same_signbit_poison_elts_signed(
1548- ; CHECK-NEXT: [[XOR_SIGNBITS:%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]]
1549- ; CHECK-NEXT: [[R:%.*]] = icmp sgt <2 x i8> [[XOR_SIGNBITS]], <i8 -1, i8 -1>
1550- ; CHECK-NEXT: ret <2 x i1> [[R]]
1546+ ; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt <2 x i8> [[Y:%.*]], <i8 -1, i8 poison>
1547+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp slt <2 x i8> [[X:%.*]], zeroinitializer
1548+ ; CHECK-NEXT: [[R1:%.*]] = xor <2 x i1> [[TMP1]], [[YPOS]]
1549+ ; CHECK-NEXT: ret <2 x i1> [[R1]]
15511550;
15521551 %xsign = ashr <2 x i8 > %x , <i8 7 , i8 poison>
15531552 %ypos = icmp sgt <2 x i8 > %y , <i8 -1 , i8 poison>
@@ -1560,11 +1559,10 @@ define <2 x i1> @same_signbit_poison_elts_signed(<2 x i8> %x, <2 x i8> %y) {
15601559
15611560define i1 @same_signbit_wrong_type_signed (i8 %x , i32 %y ) {
15621561; CHECK-LABEL: @same_signbit_wrong_type_signed(
1563- ; CHECK-NEXT: [[XSIGN:%.*]] = ashr i8 [[X:%.*]], 7
15641562; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i32 [[Y:%.*]], -1
1565- ; CHECK-NEXT: [[YPOSZ :%.*]] = sext i1 [[YPOS]] to i8
1566- ; CHECK-NEXT: [[R :%.*]] = icmp ne i8 [[XSIGN ]], [[YPOSZ ]]
1567- ; CHECK-NEXT: ret i1 [[R ]]
1563+ ; CHECK-NEXT: [[TMP1 :%.*]] = icmp slt i8 [[X:%.*]], 0
1564+ ; CHECK-NEXT: [[R1 :%.*]] = xor i1 [[TMP1 ]], [[YPOS ]]
1565+ ; CHECK-NEXT: ret i1 [[R1 ]]
15681566;
15691567 %xsign = ashr i8 %x , 7
15701568 %ypos = icmp sgt i32 %y , -1
@@ -1592,10 +1590,10 @@ define i1 @exactly_one_set_signbit_wrong_shamt_signed(i8 %x, i8 %y) {
15921590
15931591define i1 @slt_zero_ult_i1 (i32 %a , i1 %b ) {
15941592; CHECK-LABEL: @slt_zero_ult_i1(
1595- ; CHECK-NEXT: [[CONV :%.*]] = zext i1 [[B :%.*]] to i32
1596- ; CHECK-NEXT: [[CMP1 :%.*]] = lshr i32 [[A :%.*]], 31
1597- ; CHECK-NEXT: [[CMP2 :%.*]] = icmp ugt i32 [[CMP1 ]], [[CONV ]]
1598- ; CHECK-NEXT: ret i1 [[CMP2 ]]
1593+ ; CHECK-NEXT: [[TMP1 :%.*]] = icmp slt i32 [[A :%.*]], 0
1594+ ; CHECK-NEXT: [[TMP2 :%.*]] = xor i1 [[B :%.*]], true
1595+ ; CHECK-NEXT: [[CMP21 :%.*]] = and i1 [[TMP1 ]], [[TMP2 ]]
1596+ ; CHECK-NEXT: ret i1 [[CMP21 ]]
15991597;
16001598 %conv = zext i1 %b to i32
16011599 %cmp1 = lshr i32 %a , 31
@@ -1631,10 +1629,10 @@ define i1 @slt_zero_ult_i1_fail2(i32 %a, i1 %b) {
16311629
16321630define i1 @slt_zero_slt_i1_fail (i32 %a , i1 %b ) {
16331631; CHECK-LABEL: @slt_zero_slt_i1_fail(
1634- ; CHECK-NEXT: [[CONV :%.*]] = zext i1 [[B :%.*]] to i32
1635- ; CHECK-NEXT: [[CMP1 :%.*]] = lshr i32 [[A :%.*]], 31
1636- ; CHECK-NEXT: [[CMP2 :%.*]] = icmp ugt i32 [[CMP1 ]], [[CONV ]]
1637- ; CHECK-NEXT: ret i1 [[CMP2 ]]
1632+ ; CHECK-NEXT: [[TMP1 :%.*]] = icmp slt i32 [[A :%.*]], 0
1633+ ; CHECK-NEXT: [[TMP2 :%.*]] = xor i1 [[B :%.*]], true
1634+ ; CHECK-NEXT: [[CMP21 :%.*]] = and i1 [[TMP1 ]], [[TMP2 ]]
1635+ ; CHECK-NEXT: ret i1 [[CMP21 ]]
16381636;
16391637 %conv = zext i1 %b to i32
16401638 %cmp1 = lshr i32 %a , 31
@@ -1644,10 +1642,9 @@ define i1 @slt_zero_slt_i1_fail(i32 %a, i1 %b) {
16441642
16451643define i1 @slt_zero_eq_i1_signed (i32 %a , i1 %b ) {
16461644; CHECK-LABEL: @slt_zero_eq_i1_signed(
1647- ; CHECK-NEXT: [[CONV:%.*]] = sext i1 [[B:%.*]] to i32
1648- ; CHECK-NEXT: [[CMP1:%.*]] = ashr i32 [[A:%.*]], 31
1649- ; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[CMP1]], [[CONV]]
1650- ; CHECK-NEXT: ret i1 [[CMP2]]
1645+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i32 [[A:%.*]], -1
1646+ ; CHECK-NEXT: [[CMP21:%.*]] = xor i1 [[TMP1]], [[B:%.*]]
1647+ ; CHECK-NEXT: ret i1 [[CMP21]]
16511648;
16521649 %conv = sext i1 %b to i32
16531650 %cmp1 = ashr i32 %a , 31
0 commit comments