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