15fe70be7SNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 25fe70be7SNoah Goldstein; RUN: opt < %s -passes=instcombine -S | FileCheck %s 35fe70be7SNoah Goldstein 45fe70be7SNoah Goldsteindefine <2 x i1> @sub_XY_and_bit0_is_zero(<2 x i8> %x, <2 x i8> %C) nounwind { 55fe70be7SNoah Goldstein; CHECK-LABEL: @sub_XY_and_bit0_is_zero( 6196d3e39SNoah Goldstein; CHECK-NEXT: ret <2 x i1> zeroinitializer 75fe70be7SNoah Goldstein; 85fe70be7SNoah Goldstein %C1 = or <2 x i8> %C, <i8 9, i8 9> 95fe70be7SNoah Goldstein %y = sub <2 x i8> %x, %C1 105fe70be7SNoah Goldstein %w = and <2 x i8> %x, %y 115fe70be7SNoah Goldstein %r = icmp eq <2 x i8> %w, <i8 -1, i8 -1> 125fe70be7SNoah Goldstein ret <2 x i1> %r 135fe70be7SNoah Goldstein} 145fe70be7SNoah Goldstein 155fe70be7SNoah Goldsteindefine i1 @sub_XY_xor_bit0_is_one(i8 %x, i8 %C) nounwind { 165fe70be7SNoah Goldstein; CHECK-LABEL: @sub_XY_xor_bit0_is_one( 17196d3e39SNoah Goldstein; CHECK-NEXT: ret i1 false 185fe70be7SNoah Goldstein; 195fe70be7SNoah Goldstein %C1 = or i8 %C, 1 205fe70be7SNoah Goldstein %y = sub i8 %x, %C1 215fe70be7SNoah Goldstein %w = xor i8 %x, %y 225fe70be7SNoah Goldstein %r = icmp eq i8 %w, 10 235fe70be7SNoah Goldstein ret i1 %r 245fe70be7SNoah Goldstein} 255fe70be7SNoah Goldstein 265fe70be7SNoah Goldsteindefine i1 @sub_XY_or_bit0_is_one(i8 %x, i8 %C) nounwind { 275fe70be7SNoah Goldstein; CHECK-LABEL: @sub_XY_or_bit0_is_one( 28196d3e39SNoah Goldstein; CHECK-NEXT: ret i1 false 295fe70be7SNoah Goldstein; 305fe70be7SNoah Goldstein %C1 = or i8 %C, 1 315fe70be7SNoah Goldstein %y = sub i8 %x, %C1 325fe70be7SNoah Goldstein %w = or i8 %x, %y 335fe70be7SNoah Goldstein %r = icmp eq i8 %w, 10 345fe70be7SNoah Goldstein ret i1 %r 355fe70be7SNoah Goldstein} 365fe70be7SNoah Goldstein 375fe70be7SNoah Goldsteindefine i1 @sub_YX_and_bit0_is_zero(i8 %x, i8 %C) nounwind { 385fe70be7SNoah Goldstein; CHECK-LABEL: @sub_YX_and_bit0_is_zero( 39196d3e39SNoah Goldstein; CHECK-NEXT: ret i1 false 405fe70be7SNoah Goldstein; 415fe70be7SNoah Goldstein %C1 = or i8 %C, 1 425fe70be7SNoah Goldstein %y = sub i8 %C1, %x 435fe70be7SNoah Goldstein %w = and i8 %x, %y 445fe70be7SNoah Goldstein %r = icmp eq i8 %w, -1 455fe70be7SNoah Goldstein ret i1 %r 465fe70be7SNoah Goldstein} 475fe70be7SNoah Goldstein 485fe70be7SNoah Goldsteindefine <2 x i1> @sub_YX_xor_bit0_is_one(<2 x i8> %x, <2 x i8> %C) nounwind { 495fe70be7SNoah Goldstein; CHECK-LABEL: @sub_YX_xor_bit0_is_one( 50196d3e39SNoah Goldstein; CHECK-NEXT: ret <2 x i1> zeroinitializer 515fe70be7SNoah Goldstein; 525fe70be7SNoah Goldstein %C1 = or <2 x i8> %C, <i8 1, i8 1> 535fe70be7SNoah Goldstein %y = sub <2 x i8> %C1, %x 545fe70be7SNoah Goldstein %w = xor <2 x i8> %x, %y 555fe70be7SNoah Goldstein %r = icmp eq <2 x i8> %w, <i8 12, i8 12> 565fe70be7SNoah Goldstein ret <2 x i1> %r 575fe70be7SNoah Goldstein} 585fe70be7SNoah Goldstein 595fe70be7SNoah Goldsteindefine i1 @sub_YX_or_bit0_is_one(i8 %x, i8 %C) nounwind { 605fe70be7SNoah Goldstein; CHECK-LABEL: @sub_YX_or_bit0_is_one( 61196d3e39SNoah Goldstein; CHECK-NEXT: ret i1 false 625fe70be7SNoah Goldstein; 635fe70be7SNoah Goldstein %C1 = or i8 %C, 1 645fe70be7SNoah Goldstein %y = sub i8 %C1, %x 655fe70be7SNoah Goldstein %w = or i8 %x, %y 665fe70be7SNoah Goldstein %r = icmp eq i8 %w, 32 675fe70be7SNoah Goldstein ret i1 %r 685fe70be7SNoah Goldstein} 695fe70be7SNoah Goldstein 705fe70be7SNoah Goldsteindefine i1 @add_YX_xor_bit0_is_one(i8 %x, i8 %C) nounwind { 715fe70be7SNoah Goldstein; CHECK-LABEL: @add_YX_xor_bit0_is_one( 72196d3e39SNoah Goldstein; CHECK-NEXT: ret i1 false 735fe70be7SNoah Goldstein; 745fe70be7SNoah Goldstein %C1 = or i8 %C, 1 755fe70be7SNoah Goldstein %y = add i8 %C1, %x 765fe70be7SNoah Goldstein %w = xor i8 %x, %y 775fe70be7SNoah Goldstein %r = icmp eq i8 %w, 32 785fe70be7SNoah Goldstein ret i1 %r 795fe70be7SNoah Goldstein} 805fe70be7SNoah Goldstein 815fe70be7SNoah Goldsteindefine <2 x i1> @add_XY_or_bit0_is_one(<2 x i8> %x, <2 x i8> %C) nounwind { 825fe70be7SNoah Goldstein; CHECK-LABEL: @add_XY_or_bit0_is_one( 83196d3e39SNoah Goldstein; CHECK-NEXT: ret <2 x i1> zeroinitializer 845fe70be7SNoah Goldstein; 855fe70be7SNoah Goldstein %C1 = or <2 x i8> %C, <i8 1, i8 1> 865fe70be7SNoah Goldstein %y = add <2 x i8> %C1, %x 875fe70be7SNoah Goldstein %w = or <2 x i8> %x, %y 885fe70be7SNoah Goldstein %r = icmp eq <2 x i8> %w, <i8 90, i8 90> 895fe70be7SNoah Goldstein ret <2 x i1> %r 905fe70be7SNoah Goldstein} 915fe70be7SNoah Goldstein 925fe70be7SNoah Goldsteindefine <2 x i1> @sub_XY_and_bit0_is_zero_fail(<2 x i8> %x, <2 x i8> %C) nounwind { 935fe70be7SNoah Goldstein; CHECK-LABEL: @sub_XY_and_bit0_is_zero_fail( 94*38fffa63SPaul Walker; CHECK-NEXT: [[C1:%.*]] = or <2 x i8> [[C:%.*]], splat (i8 8) 955fe70be7SNoah Goldstein; CHECK-NEXT: [[Y:%.*]] = sub <2 x i8> [[X:%.*]], [[C1]] 96a1058776SNikita Popov; CHECK-NEXT: [[W:%.*]] = and <2 x i8> [[X]], [[Y]] 97*38fffa63SPaul Walker; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i8> [[W]], splat (i8 -1) 985fe70be7SNoah Goldstein; CHECK-NEXT: ret <2 x i1> [[R]] 995fe70be7SNoah Goldstein; 1005fe70be7SNoah Goldstein %C1 = or <2 x i8> %C, <i8 8, i8 8> 1015fe70be7SNoah Goldstein %y = sub <2 x i8> %x, %C1 1025fe70be7SNoah Goldstein %w = and <2 x i8> %x, %y 1035fe70be7SNoah Goldstein %r = icmp eq <2 x i8> %w, <i8 -1, i8 -1> 1045fe70be7SNoah Goldstein ret <2 x i1> %r 1055fe70be7SNoah Goldstein} 1065fe70be7SNoah Goldstein 1075fe70be7SNoah Goldsteindefine i1 @sub_XY_xor_bit0_is_one_fail(i8 %x, i8 %C) nounwind { 1085fe70be7SNoah Goldstein; CHECK-LABEL: @sub_XY_xor_bit0_is_one_fail( 109f112e469SNoah Goldstein; CHECK-NEXT: [[C1:%.*]] = xor i8 [[C:%.*]], 1 110f112e469SNoah Goldstein; CHECK-NEXT: [[Y:%.*]] = sub i8 [[X:%.*]], [[C1]] 111a1058776SNikita Popov; CHECK-NEXT: [[W:%.*]] = xor i8 [[X]], [[Y]] 1125fe70be7SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[W]], 10 1135fe70be7SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 1145fe70be7SNoah Goldstein; 1155fe70be7SNoah Goldstein %C1 = xor i8 %C, 1 1165fe70be7SNoah Goldstein %y = sub i8 %x, %C1 1175fe70be7SNoah Goldstein %w = xor i8 %x, %y 1185fe70be7SNoah Goldstein %r = icmp eq i8 %w, 10 1195fe70be7SNoah Goldstein ret i1 %r 1205fe70be7SNoah Goldstein} 1215fe70be7SNoah Goldstein 1225fe70be7SNoah Goldsteindefine i1 @sub_XY_or_bit0_is_one_fail(i8 %x, i8 %C) nounwind { 1235fe70be7SNoah Goldstein; CHECK-LABEL: @sub_XY_or_bit0_is_one_fail( 1245fe70be7SNoah Goldstein; CHECK-NEXT: [[Y:%.*]] = sub i8 [[X:%.*]], [[C:%.*]] 125a1058776SNikita Popov; CHECK-NEXT: [[W:%.*]] = or i8 [[X]], [[Y]] 1265fe70be7SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[W]], 10 1275fe70be7SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 1285fe70be7SNoah Goldstein; 1295fe70be7SNoah Goldstein %y = sub i8 %x, %C 1305fe70be7SNoah Goldstein %w = or i8 %x, %y 1315fe70be7SNoah Goldstein %r = icmp eq i8 %w, 10 1325fe70be7SNoah Goldstein ret i1 %r 1335fe70be7SNoah Goldstein} 1345fe70be7SNoah Goldstein 1355fe70be7SNoah Goldsteindefine i1 @sub_YX_and_bit0_is_zero_fail(i8 %x, i8 %C) nounwind { 1365fe70be7SNoah Goldstein; CHECK-LABEL: @sub_YX_and_bit0_is_zero_fail( 1375fe70be7SNoah Goldstein; CHECK-NEXT: [[Y:%.*]] = sub i8 [[C:%.*]], [[X:%.*]] 138a1058776SNikita Popov; CHECK-NEXT: [[W:%.*]] = and i8 [[X]], [[Y]] 1395fe70be7SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[W]], -1 1405fe70be7SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 1415fe70be7SNoah Goldstein; 1425fe70be7SNoah Goldstein %y = sub i8 %C, %x 1435fe70be7SNoah Goldstein %w = and i8 %x, %y 1445fe70be7SNoah Goldstein %r = icmp eq i8 %w, -1 1455fe70be7SNoah Goldstein ret i1 %r 1465fe70be7SNoah Goldstein} 1475fe70be7SNoah Goldstein 1485fe70be7SNoah Goldsteindefine <2 x i1> @sub_YX_xor_bit0_is_one_fail(<2 x i8> %x, <2 x i8> %C) nounwind { 1495fe70be7SNoah Goldstein; CHECK-LABEL: @sub_YX_xor_bit0_is_one_fail( 150cf47af49SNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = sub <2 x i8> [[X:%.*]], [[C:%.*]] 151a1058776SNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = xor <2 x i8> [[X]], [[TMP1]] 152*38fffa63SPaul Walker; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i8> [[TMP2]], splat (i8 -13) 1535fe70be7SNoah Goldstein; CHECK-NEXT: ret <2 x i1> [[R]] 1545fe70be7SNoah Goldstein; 1555fe70be7SNoah Goldstein %C1 = sub <2 x i8> %C, <i8 1, i8 1> 1565fe70be7SNoah Goldstein %y = sub <2 x i8> %C1, %x 1575fe70be7SNoah Goldstein %w = xor <2 x i8> %x, %y 1585fe70be7SNoah Goldstein %r = icmp eq <2 x i8> %w, <i8 12, i8 12> 1595fe70be7SNoah Goldstein ret <2 x i1> %r 1605fe70be7SNoah Goldstein} 1615fe70be7SNoah Goldstein 1625fe70be7SNoah Goldsteindefine i1 @sub_YX_or_bit0_is_one_fail(i8 %x, i8 %C) nounwind { 1635fe70be7SNoah Goldstein; CHECK-LABEL: @sub_YX_or_bit0_is_one_fail( 1645fe70be7SNoah Goldstein; CHECK-NEXT: [[C1:%.*]] = xor i8 [[C:%.*]], 1 1655fe70be7SNoah Goldstein; CHECK-NEXT: [[Y:%.*]] = sub i8 [[C1]], [[X:%.*]] 166a1058776SNikita Popov; CHECK-NEXT: [[W:%.*]] = or i8 [[X]], [[Y]] 1675fe70be7SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[W]], 32 1685fe70be7SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 1695fe70be7SNoah Goldstein; 1705fe70be7SNoah Goldstein %C1 = xor i8 %C, 1 1715fe70be7SNoah Goldstein %y = sub i8 %C1, %x 1725fe70be7SNoah Goldstein %w = or i8 %x, %y 1735fe70be7SNoah Goldstein %r = icmp eq i8 %w, 32 1745fe70be7SNoah Goldstein ret i1 %r 1755fe70be7SNoah Goldstein} 1765fe70be7SNoah Goldstein 1775fe70be7SNoah Goldsteindefine i1 @add_YX_xor_bit0_is_one_fail(i8 %x, i8 %C) nounwind { 1785fe70be7SNoah Goldstein; CHECK-LABEL: @add_YX_xor_bit0_is_one_fail( 1795fe70be7SNoah Goldstein; CHECK-NEXT: [[C1:%.*]] = and i8 [[C:%.*]], 1 1805fe70be7SNoah Goldstein; CHECK-NEXT: [[Y:%.*]] = add i8 [[C1]], [[X:%.*]] 181a1058776SNikita Popov; CHECK-NEXT: [[W:%.*]] = xor i8 [[X]], [[Y]] 1825fe70be7SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[W]], 32 1835fe70be7SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 1845fe70be7SNoah Goldstein; 1855fe70be7SNoah Goldstein %C1 = and i8 %C, 1 1865fe70be7SNoah Goldstein %y = add i8 %C1, %x 1875fe70be7SNoah Goldstein %w = xor i8 %x, %y 1885fe70be7SNoah Goldstein %r = icmp eq i8 %w, 32 1895fe70be7SNoah Goldstein ret i1 %r 1905fe70be7SNoah Goldstein} 1915fe70be7SNoah Goldstein 1925fe70be7SNoah Goldsteindefine <2 x i1> @add_XY_or_bit0_is_one_fail(<2 x i8> %x, <2 x i8> %C) nounwind { 1935fe70be7SNoah Goldstein; CHECK-LABEL: @add_XY_or_bit0_is_one_fail( 194*38fffa63SPaul Walker; CHECK-NEXT: [[C1:%.*]] = add <2 x i8> [[C:%.*]], splat (i8 1) 1955fe70be7SNoah Goldstein; CHECK-NEXT: [[Y:%.*]] = add <2 x i8> [[C1]], [[X:%.*]] 196a1058776SNikita Popov; CHECK-NEXT: [[W:%.*]] = or <2 x i8> [[X]], [[Y]] 197*38fffa63SPaul Walker; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i8> [[W]], splat (i8 90) 1985fe70be7SNoah Goldstein; CHECK-NEXT: ret <2 x i1> [[R]] 1995fe70be7SNoah Goldstein; 2005fe70be7SNoah Goldstein %C1 = add <2 x i8> %C, <i8 1, i8 1> 2015fe70be7SNoah Goldstein %y = add <2 x i8> %C1, %x 2025fe70be7SNoah Goldstein %w = or <2 x i8> %x, %y 2035fe70be7SNoah Goldstein %r = icmp eq <2 x i8> %w, <i8 90, i8 90> 2045fe70be7SNoah Goldstein ret <2 x i1> %r 2055fe70be7SNoah Goldstein} 2065fe70be7SNoah Goldstein 2075fe70be7SNoah Goldstein;; These tests are just to check if it can simplify using demanded bits path. 2085fe70be7SNoah Goldsteindefine <2 x i32> @add_and_eval_vec(<2 x i32> %x, <2 x i32> %C) { 2095fe70be7SNoah Goldstein; CHECK-LABEL: @add_and_eval_vec( 2104fcfff4fSNoah Goldstein; CHECK-NEXT: ret <2 x i32> zeroinitializer 2115fe70be7SNoah Goldstein; 2125fe70be7SNoah Goldstein %y = add <2 x i32> %x, <i32 1, i32 1> 2135fe70be7SNoah Goldstein %z = and <2 x i32> %x, %y 2145fe70be7SNoah Goldstein ;; shl so we don't commute the and 2155fe70be7SNoah Goldstein %b = shl <2 x i32> %z, <i32 31, i32 31> 2165fe70be7SNoah Goldstein ret <2 x i32> %b 2175fe70be7SNoah Goldstein} 2185fe70be7SNoah Goldstein 2195fe70be7SNoah Goldstein 2205fe70be7SNoah Goldsteindefine <2 x i32> @add_xor_eval_vec(<2 x i32> %x) { 2215fe70be7SNoah Goldstein; CHECK-LABEL: @add_xor_eval_vec( 222*38fffa63SPaul Walker; CHECK-NEXT: ret <2 x i32> splat (i32 1) 2235fe70be7SNoah Goldstein; 2245fe70be7SNoah Goldstein %y = add <2 x i32> %x, <i32 1, i32 1> 2255fe70be7SNoah Goldstein %z = xor <2 x i32> %y, %x 2265fe70be7SNoah Goldstein %b = and <2 x i32> %z, <i32 1, i32 1> 2275fe70be7SNoah Goldstein ret <2 x i32> %b 2285fe70be7SNoah Goldstein} 2295fe70be7SNoah Goldstein 2305fe70be7SNoah Goldsteindefine <2 x i32> @add_or_eval_vec(<2 x i32> %x, <2 x i32> %C) { 2315fe70be7SNoah Goldstein; CHECK-LABEL: @add_or_eval_vec( 232*38fffa63SPaul Walker; CHECK-NEXT: ret <2 x i32> splat (i32 1) 2335fe70be7SNoah Goldstein; 2345fe70be7SNoah Goldstein %y = add <2 x i32> %x, <i32 1, i32 1> 2355fe70be7SNoah Goldstein %z = or <2 x i32> %y, %x 2365fe70be7SNoah Goldstein %b = and <2 x i32> %z, <i32 1, i32 1> 2375fe70be7SNoah Goldstein ret <2 x i32> %b 2385fe70be7SNoah Goldstein} 239