1 ; Replace a 'select' with 'or' in 'select - cmp [eq|ne] - br' sequence
2 ; RUN: opt -instcombine -S < %s | FileCheck %s
4 %C = type <{ %struct.S }>
5 %struct.S = type { i64*, i32, i32 }
7 declare void @bar(%struct.S *) #1
9 define void @test1(%C*) {
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
23 ; <label>:9 ; preds = %10, %12
26 ; <label>:10 ; preds = %entry
27 %11 = getelementptr inbounds %C* %7, i64 0, i32 0
28 tail call void @bar(%struct.S* %11)
31 ; <label>:12 ; preds = %entry
32 %13 = tail call i64 %5(%C* %0)
34 ; CHECK-LABEL: @test1(
39 define void @test2(%C*) {
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
53 ; <label>:9 ; preds = %10, %12
56 ; <label>:10 ; preds = %entry
57 %11 = getelementptr inbounds %C* %7, i64 0, i32 0
58 tail call void @bar(%struct.S* %11)
61 ; <label>:12 ; preds = %entry
62 %13 = tail call i64 %5(%C* %0)
64 ; CHECK-LABEL: @test2(
69 define void @test3(%C*) {
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
83 ; <label>:9 ; preds = %10, %12
86 ; <label>:10 ; preds = %entry
87 %11 = getelementptr inbounds %C* %7, i64 0, i32 0
88 tail call void @bar(%struct.S* %11)
91 ; <label>:12 ; preds = %entry
92 %13 = tail call i64 %5(%C* %0)
94 ; CHECK-LABEL: @test3(
99 define void @test4(%C*) {
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
113 ; <label>:9 ; preds = %10, %12
116 ; <label>:10 ; preds = %entry
117 %11 = getelementptr inbounds %C* %7, i64 0, i32 0
118 tail call void @bar(%struct.S* %11)
121 ; <label>:12 ; preds = %entry
122 %13 = tail call i64 %5(%C* %0)
124 ; CHECK-LABEL: @test4(