1*9880d681SAndroid Build Coastguard Worker; RUN: llc -spec-exec-max-speculation-cost=0 -march=r600 -r600-ir-structurize=0 -mcpu=redwood < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; These tests make sure the compiler is optimizing branches using predicates 4*9880d681SAndroid Build Coastguard Worker; when it is legal to do so. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}simple_if: 7*9880d681SAndroid Build Coastguard Worker; CHECK: PRED_SET{{[EGN][ET]*}}_INT * Pred, 8*9880d681SAndroid Build Coastguard Worker; CHECK: LSHL * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, 1, Pred_sel 9*9880d681SAndroid Build Coastguard Workerdefine void @simple_if(i32 addrspace(1)* %out, i32 %in) { 10*9880d681SAndroid Build Coastguard Workerentry: 11*9880d681SAndroid Build Coastguard Worker %cmp0 = icmp sgt i32 %in, 0 12*9880d681SAndroid Build Coastguard Worker br i1 %cmp0, label %IF, label %ENDIF 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard WorkerIF: 15*9880d681SAndroid Build Coastguard Worker %tmp1 = shl i32 %in, 1 16*9880d681SAndroid Build Coastguard Worker br label %ENDIF 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard WorkerENDIF: 19*9880d681SAndroid Build Coastguard Worker %tmp2 = phi i32 [ %in, %entry ], [ %tmp1, %IF ] 20*9880d681SAndroid Build Coastguard Worker store i32 %tmp2, i32 addrspace(1)* %out 21*9880d681SAndroid Build Coastguard Worker ret void 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}simple_if_else: 25*9880d681SAndroid Build Coastguard Worker; CHECK: PRED_SET{{[EGN][ET]*}}_INT * Pred, 26*9880d681SAndroid Build Coastguard Worker; CHECK: LSH{{[LR] \* T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, 1, Pred_sel 27*9880d681SAndroid Build Coastguard Worker; CHECK: LSH{{[LR] \* T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, 1, Pred_sel 28*9880d681SAndroid Build Coastguard Workerdefine void @simple_if_else(i32 addrspace(1)* %out, i32 %in) { 29*9880d681SAndroid Build Coastguard Workerentry: 30*9880d681SAndroid Build Coastguard Worker %0 = icmp sgt i32 %in, 0 31*9880d681SAndroid Build Coastguard Worker br i1 %0, label %IF, label %ELSE 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard WorkerIF: 34*9880d681SAndroid Build Coastguard Worker %1 = shl i32 %in, 1 35*9880d681SAndroid Build Coastguard Worker br label %ENDIF 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard WorkerELSE: 38*9880d681SAndroid Build Coastguard Worker %2 = lshr i32 %in, 1 39*9880d681SAndroid Build Coastguard Worker br label %ENDIF 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard WorkerENDIF: 42*9880d681SAndroid Build Coastguard Worker %3 = phi i32 [ %1, %IF ], [ %2, %ELSE ] 43*9880d681SAndroid Build Coastguard Worker store i32 %3, i32 addrspace(1)* %out 44*9880d681SAndroid Build Coastguard Worker ret void 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}nested_if: 48*9880d681SAndroid Build Coastguard Worker; CHECK: ALU_PUSH_BEFORE 49*9880d681SAndroid Build Coastguard Worker; CHECK: JUMP 50*9880d681SAndroid Build Coastguard Worker; CHECK: POP 51*9880d681SAndroid Build Coastguard Worker; CHECK: PRED_SET{{[EGN][ET]*}}_INT * Exec 52*9880d681SAndroid Build Coastguard Worker; CHECK: PRED_SET{{[EGN][ET]*}}_INT * Pred, 53*9880d681SAndroid Build Coastguard Worker; CHECK: LSHL * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, 1, Pred_sel 54*9880d681SAndroid Build Coastguard Workerdefine void @nested_if(i32 addrspace(1)* %out, i32 %in) { 55*9880d681SAndroid Build Coastguard Workerentry: 56*9880d681SAndroid Build Coastguard Worker %0 = icmp sgt i32 %in, 0 57*9880d681SAndroid Build Coastguard Worker br i1 %0, label %IF0, label %ENDIF 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard WorkerIF0: 60*9880d681SAndroid Build Coastguard Worker %1 = add i32 %in, 10 61*9880d681SAndroid Build Coastguard Worker %2 = icmp sgt i32 %1, 0 62*9880d681SAndroid Build Coastguard Worker br i1 %2, label %IF1, label %ENDIF 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard WorkerIF1: 65*9880d681SAndroid Build Coastguard Worker %3 = shl i32 %1, 1 66*9880d681SAndroid Build Coastguard Worker br label %ENDIF 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard WorkerENDIF: 69*9880d681SAndroid Build Coastguard Worker %4 = phi i32 [%in, %entry], [%1, %IF0], [%3, %IF1] 70*9880d681SAndroid Build Coastguard Worker store i32 %4, i32 addrspace(1)* %out 71*9880d681SAndroid Build Coastguard Worker ret void 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}nested_if_else: 75*9880d681SAndroid Build Coastguard Worker; CHECK: ALU_PUSH_BEFORE 76*9880d681SAndroid Build Coastguard Worker; CHECK: JUMP 77*9880d681SAndroid Build Coastguard Worker; CHECK: POP 78*9880d681SAndroid Build Coastguard Worker; CHECK: PRED_SET{{[EGN][ET]*}}_INT * Exec 79*9880d681SAndroid Build Coastguard Worker; CHECK: PRED_SET{{[EGN][ET]*}}_INT * Pred, 80*9880d681SAndroid Build Coastguard Worker; CHECK: LSH{{[LR] \* T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, 1, Pred_sel 81*9880d681SAndroid Build Coastguard Worker; CHECK: LSH{{[LR] \* T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, 1, Pred_sel 82*9880d681SAndroid Build Coastguard Workerdefine void @nested_if_else(i32 addrspace(1)* %out, i32 %in) { 83*9880d681SAndroid Build Coastguard Workerentry: 84*9880d681SAndroid Build Coastguard Worker %0 = icmp sgt i32 %in, 0 85*9880d681SAndroid Build Coastguard Worker br i1 %0, label %IF0, label %ENDIF 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard WorkerIF0: 88*9880d681SAndroid Build Coastguard Worker %1 = add i32 %in, 10 89*9880d681SAndroid Build Coastguard Worker %2 = icmp sgt i32 %1, 0 90*9880d681SAndroid Build Coastguard Worker br i1 %2, label %IF1, label %ELSE1 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard WorkerIF1: 93*9880d681SAndroid Build Coastguard Worker %3 = shl i32 %1, 1 94*9880d681SAndroid Build Coastguard Worker br label %ENDIF 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard WorkerELSE1: 97*9880d681SAndroid Build Coastguard Worker %4 = lshr i32 %in, 1 98*9880d681SAndroid Build Coastguard Worker br label %ENDIF 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard WorkerENDIF: 101*9880d681SAndroid Build Coastguard Worker %5 = phi i32 [%in, %entry], [%3, %IF1], [%4, %ELSE1] 102*9880d681SAndroid Build Coastguard Worker store i32 %5, i32 addrspace(1)* %out 103*9880d681SAndroid Build Coastguard Worker ret void 104*9880d681SAndroid Build Coastguard Worker} 105