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, %C* %0, i64 0, i32 0, i32 0 13 %m = load i64*, i64** %1, align 8 14 %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0 15 %n = load i64*, i64** %2, align 8 16 %3 = getelementptr inbounds i64, i64* %m, i64 9 17 %4 = bitcast i64* %3 to i64 (%C*)** 18 %5 = load i64 (%C*)*, 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, %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, %C* %0, i64 0, i32 0, i32 0 44 %m = load i64*, i64** %1, align 8 45 %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0 46 %n = load i64*, i64** %2, align 8 47 %3 = getelementptr inbounds i64, i64* %m, i64 9 48 %4 = bitcast i64* %3 to i64 (%C*)** 49 %5 = load i64 (%C*)*, 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, %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, %C* %0, i64 0, i32 0, i32 0 75 %m = load i64*, i64** %1, align 8 76 %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0 77 %n = load i64*, i64** %2, align 8 78 %3 = getelementptr inbounds i64, i64* %m, i64 9 79 %4 = bitcast i64* %3 to i64 (%C*)** 80 %5 = load i64 (%C*)*, 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, %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, %C* %0, i64 0, i32 0, i32 0 106 %m = load i64*, i64** %1, align 8 107 %2 = getelementptr inbounds %C, %C* %0, i64 1, i32 0, i32 0 108 %n = load i64*, i64** %2, align 8 109 %3 = getelementptr inbounds i64, i64* %m, i64 9 110 %4 = bitcast i64* %3 to i64 (%C*)** 111 %5 = load i64 (%C*)*, 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, %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, %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 } 156