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