1*c581611eSMatt Arsenault; RUN: llc -spec-exec-max-speculation-cost=0 -march=r600 -r600-ir-structurize=0 -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
6f42c6920SMatt 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:
11f42c6920SMatt Arsenault  %cmp0 = icmp sgt i32 %in, 0
12f42c6920SMatt Arsenault  br i1 %cmp0, label %IF, label %ENDIF
1345bb48eaSTom Stellard
1445bb48eaSTom StellardIF:
15f42c6920SMatt Arsenault  %tmp1 = shl i32 %in, 1
1645bb48eaSTom Stellard  br label %ENDIF
1745bb48eaSTom Stellard
1845bb48eaSTom StellardENDIF:
19f42c6920SMatt Arsenault  %tmp2 = phi i32 [ %in, %entry ], [ %tmp1, %IF ]
20f42c6920SMatt Arsenault  store i32 %tmp2, i32 addrspace(1)* %out
2145bb48eaSTom Stellard  ret void
2245bb48eaSTom Stellard}
2345bb48eaSTom Stellard
24f42c6920SMatt 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
47f42c6920SMatt 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
74f42c6920SMatt 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