[ARM] Better OR's for MVE compares
[llvm-core.git] / test / Transforms / EarlyCSE / and_or.ll
blobf9b88fea40238384d56d5ad9301ab6cb95927821
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -early-cse -S < %s | FileCheck %s
3 ; RUN: opt -basicaa -early-cse-memssa -S < %s | FileCheck %s
5 define i32 @test_01(i32 %a, i32 %b) {
6 ; CHECK-LABEL: @test_01(
7 ; CHECK-NEXT:  entry:
8 ; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]
9 ; CHECK-NEXT:    br i1 [[COND]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
10 ; CHECK:       if.true:
11 ; CHECK-NEXT:    ret i32 [[A]]
12 ; CHECK:       if.false:
13 ; CHECK-NEXT:    ret i32 [[B]]
15 entry:
16   %cond = icmp slt i32 %a, %b
17   br i1 %cond, label %if.true, label %if.false
19 if.true:
20   %cond2 = icmp slt i32 %a, %b
21   %x = select i1 %cond2, i32 %a, i32 %b
22   ret i32 %x
24 if.false:
25   %cond3 = icmp slt i32 %a, %b
26   %y = select i1 %cond3, i32 %a, i32 %b
27   ret i32 %y
30 define i32 @test_02(i32 %a, i32 %b, i1 %c) {
31 ; CHECK-LABEL: @test_02(
32 ; CHECK-NEXT:  entry:
33 ; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]
34 ; CHECK-NEXT:    [[AND_COND:%.*]] = and i1 [[COND]], [[C:%.*]]
35 ; CHECK-NEXT:    br i1 [[AND_COND]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
36 ; CHECK:       if.true:
37 ; CHECK-NEXT:    ret i32 [[A]]
38 ; CHECK:       if.false:
39 ; CHECK-NEXT:    [[Y:%.*]] = select i1 [[COND]], i32 [[A]], i32 [[B]]
40 ; CHECK-NEXT:    ret i32 [[Y]]
42 entry:
43   %cond = icmp slt i32 %a, %b
44   %and.cond = and i1 %cond, %c
45   br i1 %and.cond, label %if.true, label %if.false
47 if.true:
48   %cond2 = icmp slt i32 %a, %b
49   %x = select i1 %cond2, i32 %a, i32 %b
50   ret i32 %x
52 if.false:
53   %cond3 = icmp slt i32 %a, %b
54   %y = select i1 %cond3, i32 %a, i32 %b
55   ret i32 %y
58 define i32 @test_03(i32 %a, i32 %b, i1 %c) {
59 ; CHECK-LABEL: @test_03(
60 ; CHECK-NEXT:  entry:
61 ; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]
62 ; CHECK-NEXT:    [[OR_COND:%.*]] = or i1 [[COND]], [[C:%.*]]
63 ; CHECK-NEXT:    br i1 [[OR_COND]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
64 ; CHECK:       if.true:
65 ; CHECK-NEXT:    [[X:%.*]] = select i1 [[COND]], i32 [[A]], i32 [[B]]
66 ; CHECK-NEXT:    ret i32 [[X]]
67 ; CHECK:       if.false:
68 ; CHECK-NEXT:    ret i32 [[B]]
70 entry:
71   %cond = icmp slt i32 %a, %b
72   %or.cond = or i1 %cond, %c
73   br i1 %or.cond, label %if.true, label %if.false
75 if.true:
76   %cond2 = icmp slt i32 %a, %b
77   %x = select i1 %cond2, i32 %a, i32 %b
78   ret i32 %x
80 if.false:
81   %cond3 = icmp slt i32 %a, %b
82   %y = select i1 %cond3, i32 %a, i32 %b
83   ret i32 %y
86 define i32 @test_04(i32 %a, i32 %b, i1 %c1, i1 %c2) {
87 ; CHECK-LABEL: @test_04(
88 ; CHECK-NEXT:  entry:
89 ; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]
90 ; CHECK-NEXT:    [[AND_COND1:%.*]] = and i1 [[COND]], [[C1:%.*]]
91 ; CHECK-NEXT:    [[AND_COND2:%.*]] = and i1 [[AND_COND1]], [[C2:%.*]]
92 ; CHECK-NEXT:    br i1 [[AND_COND2]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
93 ; CHECK:       if.true:
94 ; CHECK-NEXT:    ret i32 [[A]]
95 ; CHECK:       if.false:
96 ; CHECK-NEXT:    [[Y:%.*]] = select i1 [[COND]], i32 [[A]], i32 [[B]]
97 ; CHECK-NEXT:    ret i32 [[Y]]
99 entry:
100   %cond = icmp slt i32 %a, %b
101   %and.cond1 = and i1 %cond, %c1
102   %and.cond2 = and i1 %and.cond1, %c2
103   br i1 %and.cond2, label %if.true, label %if.false
105 if.true:
106   %cond2 = icmp slt i32 %a, %b
107   %x = select i1 %cond2, i32 %a, i32 %b
108   ret i32 %x
110 if.false:
111   %cond3 = icmp slt i32 %a, %b
112   %y = select i1 %cond3, i32 %a, i32 %b
113   ret i32 %y
116 define i32 @test_05(i32 %a, i32 %b, i1 %c1, i1 %c2) {
117 ; CHECK-LABEL: @test_05(
118 ; CHECK-NEXT:  entry:
119 ; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]
120 ; CHECK-NEXT:    [[OR_COND1:%.*]] = or i1 [[COND]], [[C1:%.*]]
121 ; CHECK-NEXT:    [[OR_COND2:%.*]] = or i1 [[OR_COND1]], [[C2:%.*]]
122 ; CHECK-NEXT:    br i1 [[OR_COND2]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
123 ; CHECK:       if.true:
124 ; CHECK-NEXT:    [[X:%.*]] = select i1 [[COND]], i32 [[A]], i32 [[B]]
125 ; CHECK-NEXT:    ret i32 [[X]]
126 ; CHECK:       if.false:
127 ; CHECK-NEXT:    ret i32 [[B]]
129 entry:
130   %cond = icmp slt i32 %a, %b
131   %or.cond1 = or i1 %cond, %c1
132   %or.cond2 = or i1 %or.cond1, %c2
133   br i1 %or.cond2, label %if.true, label %if.false
135 if.true:
136   %cond2 = icmp slt i32 %a, %b
137   %x = select i1 %cond2, i32 %a, i32 %b
138   ret i32 %x
140 if.false:
141   %cond3 = icmp slt i32 %a, %b
142   %y = select i1 %cond3, i32 %a, i32 %b
143   ret i32 %y