[AArch64][NFC] NFC for const vector as Instruction operand (#116790)
[llvm-project.git] / llvm / test / Transforms / InstCombine / icmp-select-implies-common-op.ll
blobd23634f8caf55556ecf5991b19adabf460f4d533
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S -passes=instcombine < %s | FileCheck %s
4 define i1 @sgt_3_impliesF_eq_2(i8 %x, i8 %y) {
5 ; CHECK-LABEL: @sgt_3_impliesF_eq_2(
6 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 4
7 ; CHECK-NEXT:    [[CMP21:%.*]] = icmp eq i8 [[Y:%.*]], [[X]]
8 ; CHECK-NEXT:    [[CMP2:%.*]] = select i1 [[CMP]], i1 [[CMP21]], i1 false
9 ; CHECK-NEXT:    ret i1 [[CMP2]]
11   %cmp = icmp sgt i8 %x, 3
12   %sel = select i1 %cmp, i8 2, i8 %y
13   %cmp2 = icmp eq i8 %sel, %x
14   ret i1 %cmp2
17 define i1 @sgt_3_impliesT_sgt_2(i8 %x, i8 %y) {
18 ; CHECK-LABEL: @sgt_3_impliesT_sgt_2(
19 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 4
20 ; CHECK-NEXT:    [[CMP21:%.*]] = icmp sgt i8 [[Y:%.*]], [[X]]
21 ; CHECK-NEXT:    [[CMP2:%.*]] = select i1 [[CMP]], i1 [[CMP21]], i1 false
22 ; CHECK-NEXT:    ret i1 [[CMP2]]
24   %cmp = icmp sgt i8 %x, 3
25   %sel = select i1 %cmp, i8 2, i8 %y
26   %cmp2 = icmp sgt i8 %sel, %x
27   ret i1 %cmp2
30 define i1 @sgt_x_impliesF_eq_smin_todo(i8 %x, i8 %y, i8 %z) {
31 ; CHECK-LABEL: @sgt_x_impliesF_eq_smin_todo(
32 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i8 [[X:%.*]], [[Z:%.*]]
33 ; CHECK-NEXT:    [[CMP21:%.*]] = icmp eq i8 [[Y:%.*]], [[X]]
34 ; CHECK-NEXT:    [[CMP2:%.*]] = select i1 [[CMP]], i1 [[CMP21]], i1 false
35 ; CHECK-NEXT:    ret i1 [[CMP2]]
37   %cmp = icmp sgt i8 %x, %z
38   %sel = select i1 %cmp, i8 -128, i8 %y
39   %cmp2 = icmp eq i8 %sel, %x
40   ret i1 %cmp2
43 define i1 @slt_x_impliesT_ne_smin_todo(i8 %x, i8 %y, i8 %z) {
44 ; CHECK-LABEL: @slt_x_impliesT_ne_smin_todo(
45 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X:%.*]], [[Z:%.*]]
46 ; CHECK-NEXT:    [[CMP21:%.*]] = icmp ne i8 [[Y:%.*]], [[X]]
47 ; CHECK-NEXT:    [[CMP2:%.*]] = select i1 [[CMP]], i1 true, i1 [[CMP21]]
48 ; CHECK-NEXT:    ret i1 [[CMP2]]
50   %cmp = icmp slt i8 %x, %z
51   %sel = select i1 %cmp, i8 127, i8 %y
52   %cmp2 = icmp ne i8 %x, %sel
53   ret i1 %cmp2
56 define i1 @ult_x_impliesT_eq_umax_todo(i8 %x, i8 %y, i8 %z) {
57 ; CHECK-LABEL: @ult_x_impliesT_eq_umax_todo(
58 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[Z:%.*]], [[X:%.*]]
59 ; CHECK-NEXT:    [[CMP21:%.*]] = icmp ne i8 [[Y:%.*]], [[X]]
60 ; CHECK-NEXT:    [[CMP2:%.*]] = select i1 [[CMP]], i1 true, i1 [[CMP21]]
61 ; CHECK-NEXT:    ret i1 [[CMP2]]
63   %cmp = icmp ugt i8 %z, %x
64   %sel = select i1 %cmp, i8 255, i8 %y
65   %cmp2 = icmp ne i8 %sel, %x
66   ret i1 %cmp2
69 define i1 @ult_1_impliesF_eq_1(i8 %x, i8 %y) {
70 ; CHECK-LABEL: @ult_1_impliesF_eq_1(
71 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i8 [[X:%.*]], 0
72 ; CHECK-NEXT:    [[CMP21:%.*]] = icmp eq i8 [[Y:%.*]], [[X]]
73 ; CHECK-NEXT:    [[CMP2:%.*]] = select i1 [[CMP]], i1 [[CMP21]], i1 false
74 ; CHECK-NEXT:    ret i1 [[CMP2]]
76   %cmp = icmp ult i8 %x, 1
77   %sel = select i1 %cmp, i8 1, i8 %y
78   %cmp2 = icmp eq i8 %x, %sel
79   ret i1 %cmp2
82 define i1 @ugt_x_impliesF_eq_umin_todo(i8 %x, i8 %y, i8 %z) {
83 ; CHECK-LABEL: @ugt_x_impliesF_eq_umin_todo(
84 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[Z:%.*]], [[X:%.*]]
85 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i8 0, i8 [[Y:%.*]]
86 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i8 [[X]], [[SEL]]
87 ; CHECK-NEXT:    ret i1 [[CMP2]]
89   %cmp = icmp ugt i8 %z, %x
90   %sel = select i1 %cmp, i8 0, i8 %y
91   %cmp2 = icmp eq i8 %x, %sel
92   ret i1 %cmp2