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