xref: /llvm-project/llvm/test/Analysis/ValueTracking/knownbits-and-or-xor-lowbit.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
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