xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/select-cmp-br.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Replace a 'select' with 'or' in 'select - cmp [eq|ne] - br' sequence
2*9880d681SAndroid Build Coastguard Worker; RUN: opt -instcombine -S < %s | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker%C = type <{ %struct.S }>
5*9880d681SAndroid Build Coastguard Worker%struct.S = type { i64*, i32, i32 }
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdeclare void @bar(%struct.S *) #1
8*9880d681SAndroid Build Coastguard Workerdeclare void @foobar()
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerdefine void @test1(%C*) {
11*9880d681SAndroid Build Coastguard Workerentry:
12*9880d681SAndroid Build Coastguard Worker  %1 = getelementptr inbounds %C, %C* %0, i64 0, i32 0, i32 0
13*9880d681SAndroid Build Coastguard Worker  %m = load i64*, i64** %1, align 8
14*9880d681SAndroid Build Coastguard Worker  %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0
15*9880d681SAndroid Build Coastguard Worker  %n = load i64*, i64** %2, align 8
16*9880d681SAndroid Build Coastguard Worker  %3 = getelementptr inbounds i64, i64* %m, i64 9
17*9880d681SAndroid Build Coastguard Worker  %4 = bitcast i64* %3 to i64 (%C*)**
18*9880d681SAndroid Build Coastguard Worker  %5 = load i64 (%C*)*, i64 (%C*)** %4, align 8
19*9880d681SAndroid Build Coastguard Worker  %6 = icmp eq i64* %m, %n
20*9880d681SAndroid Build Coastguard Worker  %7 = select i1 %6, %C* %0, %C* null
21*9880d681SAndroid Build Coastguard Worker  %8 = icmp eq %C* %7, null
22*9880d681SAndroid Build Coastguard Worker  br i1 %8, label %12, label %10
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker; <label>:9                                       ; preds = %10, %12
25*9880d681SAndroid Build Coastguard Worker  ret void
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker; <label>:10                                      ; preds = %entry
28*9880d681SAndroid Build Coastguard Worker  %11 = getelementptr inbounds %C, %C* %7, i64 0, i32 0
29*9880d681SAndroid Build Coastguard Worker  tail call void @bar(%struct.S* %11)
30*9880d681SAndroid Build Coastguard Worker  br label %9
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker; <label>:12                                      ; preds = %entry
33*9880d681SAndroid Build Coastguard Worker  %13 = tail call i64 %5(%C* %0)
34*9880d681SAndroid Build Coastguard Worker  br label %9
35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1(
36*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select
37*9880d681SAndroid Build Coastguard Worker; CHECK: or
38*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select
39*9880d681SAndroid Build Coastguard Worker}
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerdefine void @test2(%C*) {
42*9880d681SAndroid Build Coastguard Workerentry:
43*9880d681SAndroid Build Coastguard Worker  %1 = getelementptr inbounds %C, %C* %0, i64 0, i32 0, i32 0
44*9880d681SAndroid Build Coastguard Worker  %m = load i64*, i64** %1, align 8
45*9880d681SAndroid Build Coastguard Worker  %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0
46*9880d681SAndroid Build Coastguard Worker  %n = load i64*, i64** %2, align 8
47*9880d681SAndroid Build Coastguard Worker  %3 = getelementptr inbounds i64, i64* %m, i64 9
48*9880d681SAndroid Build Coastguard Worker  %4 = bitcast i64* %3 to i64 (%C*)**
49*9880d681SAndroid Build Coastguard Worker  %5 = load i64 (%C*)*, i64 (%C*)** %4, align 8
50*9880d681SAndroid Build Coastguard Worker  %6 = icmp eq i64* %m, %n
51*9880d681SAndroid Build Coastguard Worker  %7 = select i1 %6, %C* null, %C* %0
52*9880d681SAndroid Build Coastguard Worker  %8 = icmp eq %C* %7, null
53*9880d681SAndroid Build Coastguard Worker  br i1 %8, label %12, label %10
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker; <label>:9                                       ; preds = %10, %12
56*9880d681SAndroid Build Coastguard Worker  ret void
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker; <label>:10                                      ; preds = %entry
59*9880d681SAndroid Build Coastguard Worker  %11 = getelementptr inbounds %C, %C* %7, i64 0, i32 0
60*9880d681SAndroid Build Coastguard Worker  tail call void @bar(%struct.S* %11)
61*9880d681SAndroid Build Coastguard Worker  br label %9
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker; <label>:12                                      ; preds = %entry
64*9880d681SAndroid Build Coastguard Worker  %13 = tail call i64 %5(%C* %0)
65*9880d681SAndroid Build Coastguard Worker  br label %9
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2(
67*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select
68*9880d681SAndroid Build Coastguard Worker; CHECK: or
69*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdefine void @test3(%C*) {
73*9880d681SAndroid Build Coastguard Workerentry:
74*9880d681SAndroid Build Coastguard Worker  %1 = getelementptr inbounds %C, %C* %0, i64 0, i32 0, i32 0
75*9880d681SAndroid Build Coastguard Worker  %m = load i64*, i64** %1, align 8
76*9880d681SAndroid Build Coastguard Worker  %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0
77*9880d681SAndroid Build Coastguard Worker  %n = load i64*, i64** %2, align 8
78*9880d681SAndroid Build Coastguard Worker  %3 = getelementptr inbounds i64, i64* %m, i64 9
79*9880d681SAndroid Build Coastguard Worker  %4 = bitcast i64* %3 to i64 (%C*)**
80*9880d681SAndroid Build Coastguard Worker  %5 = load i64 (%C*)*, i64 (%C*)** %4, align 8
81*9880d681SAndroid Build Coastguard Worker  %6 = icmp eq i64* %m, %n
82*9880d681SAndroid Build Coastguard Worker  %7 = select i1 %6, %C* %0, %C* null
83*9880d681SAndroid Build Coastguard Worker  %8 = icmp ne %C* %7, null
84*9880d681SAndroid Build Coastguard Worker  br i1 %8, label %10, label %12
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker; <label>:9                                       ; preds = %10, %12
87*9880d681SAndroid Build Coastguard Worker  ret void
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker; <label>:10                                      ; preds = %entry
90*9880d681SAndroid Build Coastguard Worker  %11 = getelementptr inbounds %C, %C* %7, i64 0, i32 0
91*9880d681SAndroid Build Coastguard Worker  tail call void @bar(%struct.S* %11)
92*9880d681SAndroid Build Coastguard Worker  br label %9
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker; <label>:12                                      ; preds = %entry
95*9880d681SAndroid Build Coastguard Worker  %13 = tail call i64 %5(%C* %0)
96*9880d681SAndroid Build Coastguard Worker  br label %9
97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3(
98*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select
99*9880d681SAndroid Build Coastguard Worker; CHECK: or
100*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdefine void @test4(%C*) {
104*9880d681SAndroid Build Coastguard Workerentry:
105*9880d681SAndroid Build Coastguard Worker  %1 = getelementptr inbounds %C, %C* %0, i64 0, i32 0, i32 0
106*9880d681SAndroid Build Coastguard Worker  %m = load i64*, i64** %1, align 8
107*9880d681SAndroid Build Coastguard Worker  %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0
108*9880d681SAndroid Build Coastguard Worker  %n = load i64*, i64** %2, align 8
109*9880d681SAndroid Build Coastguard Worker  %3 = getelementptr inbounds i64, i64* %m, i64 9
110*9880d681SAndroid Build Coastguard Worker  %4 = bitcast i64* %3 to i64 (%C*)**
111*9880d681SAndroid Build Coastguard Worker  %5 = load i64 (%C*)*, i64 (%C*)** %4, align 8
112*9880d681SAndroid Build Coastguard Worker  %6 = icmp eq i64* %m, %n
113*9880d681SAndroid Build Coastguard Worker  %7 = select i1 %6, %C* null, %C* %0
114*9880d681SAndroid Build Coastguard Worker  %8 = icmp ne %C* %7, null
115*9880d681SAndroid Build Coastguard Worker  br i1 %8, label %10, label %12
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Worker; <label>:9                                       ; preds = %10, %12
118*9880d681SAndroid Build Coastguard Worker  ret void
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker; <label>:10                                      ; preds = %entry
121*9880d681SAndroid Build Coastguard Worker  %11 = getelementptr inbounds %C, %C* %7, i64 0, i32 0
122*9880d681SAndroid Build Coastguard Worker  tail call void @bar(%struct.S* %11)
123*9880d681SAndroid Build Coastguard Worker  br label %9
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker; <label>:12                                      ; preds = %entry
126*9880d681SAndroid Build Coastguard Worker  %13 = tail call i64 %5(%C* %0)
127*9880d681SAndroid Build Coastguard Worker  br label %9
128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4(
129*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select
130*9880d681SAndroid Build Coastguard Worker; CHECK: or
131*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Workerdefine void @test5(%C*, i1) {
135*9880d681SAndroid Build Coastguard Workerentry:
136*9880d681SAndroid Build Coastguard Worker  %2 = select i1 %1, %C* null, %C* %0
137*9880d681SAndroid Build Coastguard Worker  %3 = icmp ne %C* %2, null
138*9880d681SAndroid Build Coastguard Worker  br i1 %3, label %5, label %7
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker; <label>:4                                       ; preds = %10, %12
141*9880d681SAndroid Build Coastguard Worker  ret void
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Worker; <label>:5                                      ; preds = %entry
144*9880d681SAndroid Build Coastguard Worker  %6 = getelementptr inbounds %C, %C* %2, i64 0, i32 0
145*9880d681SAndroid Build Coastguard Worker  tail call void @bar(%struct.S* %6)
146*9880d681SAndroid Build Coastguard Worker  br label %4
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Worker; <label>:7                                      ; preds = %entry
149*9880d681SAndroid Build Coastguard Worker  tail call void @foobar()
150*9880d681SAndroid Build Coastguard Worker  br label %4
151*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5(
152*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select
153*9880d681SAndroid Build Coastguard Worker; CHECK: or
154*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select
155*9880d681SAndroid Build Coastguard Worker}
156