1*f42c6920SMatt Arsenault; RUN: llc -spec-exec-max-speculation-cost=0 -march=r600 -mattr=disable-irstructurizer -mcpu=redwood < %s | FileCheck %s 245bb48eaSTom Stellard 345bb48eaSTom Stellard; These tests make sure the compiler is optimizing branches using predicates 445bb48eaSTom Stellard; when it is legal to do so. 545bb48eaSTom Stellard 6*f42c6920SMatt Arsenault; CHECK-LABEL: {{^}}simple_if: 745bb48eaSTom Stellard; CHECK: PRED_SET{{[EGN][ET]*}}_INT * Pred, 845bb48eaSTom Stellard; CHECK: LSHL * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, 1, Pred_sel 945bb48eaSTom Stellarddefine void @simple_if(i32 addrspace(1)* %out, i32 %in) { 1045bb48eaSTom Stellardentry: 11*f42c6920SMatt Arsenault %cmp0 = icmp sgt i32 %in, 0 12*f42c6920SMatt Arsenault br i1 %cmp0, label %IF, label %ENDIF 1345bb48eaSTom Stellard 1445bb48eaSTom StellardIF: 15*f42c6920SMatt Arsenault %tmp1 = shl i32 %in, 1 1645bb48eaSTom Stellard br label %ENDIF 1745bb48eaSTom Stellard 1845bb48eaSTom StellardENDIF: 19*f42c6920SMatt Arsenault %tmp2 = phi i32 [ %in, %entry ], [ %tmp1, %IF ] 20*f42c6920SMatt Arsenault store i32 %tmp2, i32 addrspace(1)* %out 2145bb48eaSTom Stellard ret void 2245bb48eaSTom Stellard} 2345bb48eaSTom Stellard 24*f42c6920SMatt Arsenault; CHECK-LABEL: {{^}}simple_if_else: 2545bb48eaSTom Stellard; CHECK: PRED_SET{{[EGN][ET]*}}_INT * Pred, 2645bb48eaSTom Stellard; CHECK: LSH{{[LR] \* T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, 1, Pred_sel 2745bb48eaSTom Stellard; CHECK: LSH{{[LR] \* T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, 1, Pred_sel 2845bb48eaSTom Stellarddefine void @simple_if_else(i32 addrspace(1)* %out, i32 %in) { 2945bb48eaSTom Stellardentry: 3045bb48eaSTom Stellard %0 = icmp sgt i32 %in, 0 3145bb48eaSTom Stellard br i1 %0, label %IF, label %ELSE 3245bb48eaSTom Stellard 3345bb48eaSTom StellardIF: 3445bb48eaSTom Stellard %1 = shl i32 %in, 1 3545bb48eaSTom Stellard br label %ENDIF 3645bb48eaSTom Stellard 3745bb48eaSTom StellardELSE: 3845bb48eaSTom Stellard %2 = lshr i32 %in, 1 3945bb48eaSTom Stellard br label %ENDIF 4045bb48eaSTom Stellard 4145bb48eaSTom StellardENDIF: 4245bb48eaSTom Stellard %3 = phi i32 [ %1, %IF ], [ %2, %ELSE ] 4345bb48eaSTom Stellard store i32 %3, i32 addrspace(1)* %out 4445bb48eaSTom Stellard ret void 4545bb48eaSTom Stellard} 4645bb48eaSTom Stellard 47*f42c6920SMatt Arsenault; CHECK-LABEL: {{^}}nested_if: 4845bb48eaSTom Stellard; CHECK: ALU_PUSH_BEFORE 4945bb48eaSTom Stellard; CHECK: JUMP 5045bb48eaSTom Stellard; CHECK: POP 5145bb48eaSTom Stellard; CHECK: PRED_SET{{[EGN][ET]*}}_INT * Exec 5245bb48eaSTom Stellard; CHECK: PRED_SET{{[EGN][ET]*}}_INT * Pred, 5345bb48eaSTom Stellard; CHECK: LSHL * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, 1, Pred_sel 5445bb48eaSTom Stellarddefine void @nested_if(i32 addrspace(1)* %out, i32 %in) { 5545bb48eaSTom Stellardentry: 5645bb48eaSTom Stellard %0 = icmp sgt i32 %in, 0 5745bb48eaSTom Stellard br i1 %0, label %IF0, label %ENDIF 5845bb48eaSTom Stellard 5945bb48eaSTom StellardIF0: 6045bb48eaSTom Stellard %1 = add i32 %in, 10 6145bb48eaSTom Stellard %2 = icmp sgt i32 %1, 0 6245bb48eaSTom Stellard br i1 %2, label %IF1, label %ENDIF 6345bb48eaSTom Stellard 6445bb48eaSTom StellardIF1: 6545bb48eaSTom Stellard %3 = shl i32 %1, 1 6645bb48eaSTom Stellard br label %ENDIF 6745bb48eaSTom Stellard 6845bb48eaSTom StellardENDIF: 6945bb48eaSTom Stellard %4 = phi i32 [%in, %entry], [%1, %IF0], [%3, %IF1] 7045bb48eaSTom Stellard store i32 %4, i32 addrspace(1)* %out 7145bb48eaSTom Stellard ret void 7245bb48eaSTom Stellard} 7345bb48eaSTom Stellard 74*f42c6920SMatt Arsenault; CHECK-LABEL: {{^}}nested_if_else: 7545bb48eaSTom Stellard; CHECK: ALU_PUSH_BEFORE 7645bb48eaSTom Stellard; CHECK: JUMP 7745bb48eaSTom Stellard; CHECK: POP 7845bb48eaSTom Stellard; CHECK: PRED_SET{{[EGN][ET]*}}_INT * Exec 7945bb48eaSTom Stellard; CHECK: PRED_SET{{[EGN][ET]*}}_INT * Pred, 8045bb48eaSTom Stellard; CHECK: LSH{{[LR] \* T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, 1, Pred_sel 8145bb48eaSTom Stellard; CHECK: LSH{{[LR] \* T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, 1, Pred_sel 8245bb48eaSTom Stellarddefine void @nested_if_else(i32 addrspace(1)* %out, i32 %in) { 8345bb48eaSTom Stellardentry: 8445bb48eaSTom Stellard %0 = icmp sgt i32 %in, 0 8545bb48eaSTom Stellard br i1 %0, label %IF0, label %ENDIF 8645bb48eaSTom Stellard 8745bb48eaSTom StellardIF0: 8845bb48eaSTom Stellard %1 = add i32 %in, 10 8945bb48eaSTom Stellard %2 = icmp sgt i32 %1, 0 9045bb48eaSTom Stellard br i1 %2, label %IF1, label %ELSE1 9145bb48eaSTom Stellard 9245bb48eaSTom StellardIF1: 9345bb48eaSTom Stellard %3 = shl i32 %1, 1 9445bb48eaSTom Stellard br label %ENDIF 9545bb48eaSTom Stellard 9645bb48eaSTom StellardELSE1: 9745bb48eaSTom Stellard %4 = lshr i32 %in, 1 9845bb48eaSTom Stellard br label %ENDIF 9945bb48eaSTom Stellard 10045bb48eaSTom StellardENDIF: 10145bb48eaSTom Stellard %5 = phi i32 [%in, %entry], [%3, %IF1], [%4, %ELSE1] 10245bb48eaSTom Stellard store i32 %5, i32 addrspace(1)* %out 10345bb48eaSTom Stellard ret void 10445bb48eaSTom Stellard} 105