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