2e999510b4220bc2dae22f2d204fbcd526c7c60a
[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
9 define void @test1(%C*) {
10 entry:
11   %1 = getelementptr inbounds %C* %0, i64 0, i32 0, i32 0
12   %m = load i64** %1, align 8
13   %2 = getelementptr inbounds %C* %0, i64 1, i32 0, i32 0
14   %n = load i64** %2, align 8
15   %3 = getelementptr inbounds i64* %m, i64 9
16   %4 = bitcast i64* %3 to i64 (%C*)**
17   %5 = load i64 (%C*)** %4, align 8
18   %6 = icmp eq i64* %m, %n
19   %7 = select i1 %6, %C* %0, %C* null
20   %8 = icmp eq %C* %7, null
21   br i1 %8, label %12, label %10
22
23 ; <label>:9                                       ; preds = %10, %12
24   ret void
25
26 ; <label>:10                                      ; preds = %entry
27   %11 = getelementptr inbounds %C* %7, i64 0, i32 0
28   tail call void @bar(%struct.S* %11)
29   br label %9
30
31 ; <label>:12                                      ; preds = %entry
32   %13 = tail call i64 %5(%C* %0)
33   br label %9
34 ; CHECK-LABEL: @test1(
35 ; CHECK-NOT: select
36 ; CHECK: or
37 }
38
39 define void @test2(%C*) {
40 entry:
41   %1 = getelementptr inbounds %C* %0, i64 0, i32 0, i32 0
42   %m = load i64** %1, align 8
43   %2 = getelementptr inbounds %C* %0, i64 1, i32 0, i32 0
44   %n = load i64** %2, align 8
45   %3 = getelementptr inbounds i64* %m, i64 9
46   %4 = bitcast i64* %3 to i64 (%C*)**
47   %5 = load i64 (%C*)** %4, align 8
48   %6 = icmp eq i64* %m, %n
49   %7 = select i1 %6, %C* null, %C* %0
50   %8 = icmp eq %C* %7, null
51   br i1 %8, label %12, label %10
52
53 ; <label>:9                                       ; preds = %10, %12
54   ret void
55
56 ; <label>:10                                      ; preds = %entry
57   %11 = getelementptr inbounds %C* %7, i64 0, i32 0
58   tail call void @bar(%struct.S* %11)
59   br label %9
60
61 ; <label>:12                                      ; preds = %entry
62   %13 = tail call i64 %5(%C* %0)
63   br label %9
64 ; CHECK-LABEL: @test2(
65 ; CHECK-NOT: select
66 ; CHECK: or
67 }
68
69 define void @test3(%C*) {
70 entry:
71   %1 = getelementptr inbounds %C* %0, i64 0, i32 0, i32 0
72   %m = load i64** %1, align 8
73   %2 = getelementptr inbounds %C* %0, i64 1, i32 0, i32 0
74   %n = load i64** %2, align 8
75   %3 = getelementptr inbounds i64* %m, i64 9
76   %4 = bitcast i64* %3 to i64 (%C*)**
77   %5 = load i64 (%C*)** %4, align 8
78   %6 = icmp eq i64* %m, %n
79   %7 = select i1 %6, %C* %0, %C* null
80   %8 = icmp ne %C* %7, null
81   br i1 %8, label %10, label %12
82
83 ; <label>:9                                       ; preds = %10, %12
84   ret void
85
86 ; <label>:10                                      ; preds = %entry
87   %11 = getelementptr inbounds %C* %7, i64 0, i32 0
88   tail call void @bar(%struct.S* %11)
89   br label %9
90
91 ; <label>:12                                      ; preds = %entry
92   %13 = tail call i64 %5(%C* %0)
93   br label %9
94 ; CHECK-LABEL: @test3(
95 ; CHECK-NOT: select
96 ; CHECK: or
97 }
98
99 define void @test4(%C*) {
100 entry:
101   %1 = getelementptr inbounds %C* %0, i64 0, i32 0, i32 0
102   %m = load i64** %1, align 8
103   %2 = getelementptr inbounds %C* %0, i64 1, i32 0, i32 0
104   %n = load i64** %2, align 8
105   %3 = getelementptr inbounds i64* %m, i64 9
106   %4 = bitcast i64* %3 to i64 (%C*)**
107   %5 = load i64 (%C*)** %4, align 8
108   %6 = icmp eq i64* %m, %n
109   %7 = select i1 %6, %C* null, %C* %0
110   %8 = icmp ne %C* %7, null
111   br i1 %8, label %10, label %12
112
113 ; <label>:9                                       ; preds = %10, %12
114   ret void
115
116 ; <label>:10                                      ; preds = %entry
117   %11 = getelementptr inbounds %C* %7, i64 0, i32 0
118   tail call void @bar(%struct.S* %11)
119   br label %9
120
121 ; <label>:12                                      ; preds = %entry
122   %13 = tail call i64 %5(%C* %0)
123   br label %9
124 ; CHECK-LABEL: @test4(
125 ; CHECK-NOT: select
126 ; CHECK: or
127 }