1*9880d681SAndroid Build Coastguard Worker; RUN: opt -simplifycfg -S < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; It's not worthwhile to if-convert one of the phi nodes and leave 4*9880d681SAndroid Build Coastguard Worker; the other behind, because that still requires a branch. If 5*9880d681SAndroid Build Coastguard Worker; SimplifyCFG if-converts one of the phis, it should do both. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; CHECK: %div.high.addr.0 = select i1 %cmp1, i32 %div, i32 %high.addr.0 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %low.0.add2 = select i1 %cmp1, i32 %low.0, i32 %add2 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %while.cond 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerdefine i32 @upper_bound(i32* %r, i32 %high, i32 %k) nounwind { 12*9880d681SAndroid Build Coastguard Workerentry: 13*9880d681SAndroid Build Coastguard Worker br label %while.cond 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerwhile.cond: ; preds = %if.then, %if.else, %entry 16*9880d681SAndroid Build Coastguard Worker %high.addr.0 = phi i32 [ %high, %entry ], [ %div, %if.then ], [ %high.addr.0, %if.else ] 17*9880d681SAndroid Build Coastguard Worker %low.0 = phi i32 [ 0, %entry ], [ %low.0, %if.then ], [ %add2, %if.else ] 18*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i32 %low.0, %high.addr.0 19*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %while.body, label %while.end 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerwhile.body: ; preds = %while.cond 22*9880d681SAndroid Build Coastguard Worker %add = add i32 %low.0, %high.addr.0 23*9880d681SAndroid Build Coastguard Worker %div = udiv i32 %add, 2 24*9880d681SAndroid Build Coastguard Worker %idxprom = zext i32 %div to i64 25*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %r, i64 %idxprom 26*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx 27*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp ult i32 %k, %0 28*9880d681SAndroid Build Coastguard Worker br i1 %cmp1, label %if.then, label %if.else 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %while.body 31*9880d681SAndroid Build Coastguard Worker br label %while.cond 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %while.body 34*9880d681SAndroid Build Coastguard Worker %add2 = add i32 %div, 1 35*9880d681SAndroid Build Coastguard Worker br label %while.cond 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerwhile.end: ; preds = %while.cond 38*9880d681SAndroid Build Coastguard Worker ret i32 %low.0 39*9880d681SAndroid Build Coastguard Worker} 40