blob: ba9aa29130611b7cb3b1c9df5f7756e881397f15 [file] [log] [blame]
Tom Stellard071ec902015-02-04 20:49:44 +00001; RUN: opt -S -structurizecfg %s -o - | FileCheck %s
2
3; The structurize cfg pass used to do a post-order traversal to generate a list
4; of ; basic blocks and then operate on the list in reverse. This led to bugs,
5; because sometimes successors would be visited before their predecessors.
6; The fix for this was to do a reverse post-order traversal which is what the
7; algorithm requires.
8
9; Function Attrs: nounwind
10define void @test(float* nocapture %out, i32 %K1, float* nocapture readonly %nr) {
11
12; CHECK: entry:
13; CHECK: br label %for.body
14entry:
15 br label %for.body
16
17; CHECK: for.body:
18; CHECK: br i1 %{{[0-9]+}}, label %lor.lhs.false, label %Flow
19for.body: ; preds = %for.body.backedge, %entry
20 %indvars.iv = phi i64 [ %indvars.iv.be, %for.body.backedge ], [ 1, %entry ]
21 %best_val.027 = phi float [ %best_val.027.be, %for.body.backedge ], [ 5.000000e+01, %entry ]
22 %prev_start.026 = phi i32 [ %tmp26, %for.body.backedge ], [ 0, %entry ]
23 %best_count.025 = phi i32 [ %best_count.025.be, %for.body.backedge ], [ 0, %entry ]
24 %tmp0 = trunc i64 %indvars.iv to i32
25 %cmp1 = icmp eq i32 %tmp0, %K1
26 br i1 %cmp1, label %if.then, label %lor.lhs.false
27
28; CHECK: lor.lhs.false:
29; CHECK: br label %Flow
30lor.lhs.false: ; preds = %for.body
David Blaikie79e6c742015-02-27 19:29:02 +000031 %arrayidx = getelementptr inbounds float, float* %nr, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +000032 %tmp1 = load float, float* %arrayidx, align 4
Tom Stellard071ec902015-02-04 20:49:44 +000033 %tmp2 = add nsw i64 %indvars.iv, -1
David Blaikie79e6c742015-02-27 19:29:02 +000034 %arrayidx2 = getelementptr inbounds float, float* %nr, i64 %tmp2
David Blaikiea79ac142015-02-27 21:17:42 +000035 %tmp3 = load float, float* %arrayidx2, align 4
Tom Stellard071ec902015-02-04 20:49:44 +000036 %cmp3 = fcmp une float %tmp1, %tmp3
37 br i1 %cmp3, label %if.then, label %for.body.1
38
39; CHECK: Flow:
40; CHECK: br i1 %{{[0-9]+}}, label %if.then, label %Flow1
41
42; CHECK: if.then:
43; CHECK: br label %Flow1
44if.then: ; preds = %lor.lhs.false, %for.body
45 %sub4 = sub nsw i32 %tmp0, %prev_start.026
46 %tmp4 = add nsw i64 %indvars.iv, -1
David Blaikie79e6c742015-02-27 19:29:02 +000047 %arrayidx8 = getelementptr inbounds float, float* %nr, i64 %tmp4
David Blaikiea79ac142015-02-27 21:17:42 +000048 %tmp5 = load float, float* %arrayidx8, align 4
Tom Stellard071ec902015-02-04 20:49:44 +000049 br i1 %cmp1, label %for.end, label %for.body.1
50
51; CHECK: for.end:
52; CHECK: ret void
53for.end: ; preds = %for.body.1, %if.then
54 %best_val.0.lcssa = phi float [ %best_val.233, %for.body.1 ], [ %tmp5, %if.then ]
55 store float %best_val.0.lcssa, float* %out, align 4
56 ret void
57
58; CHECK: Flow1
59; CHECK: br i1 %{{[0-9]}}, label %for.body.1, label %Flow2
60
61; CHECK: for.body.1:
62; CHECK: br i1 %{{[0-9]+}}, label %for.body.6, label %Flow3
63for.body.1: ; preds = %if.then, %lor.lhs.false
64 %best_val.233 = phi float [ %tmp5, %if.then ], [ %best_val.027, %lor.lhs.false ]
65 %best_count.231 = phi i32 [ %sub4, %if.then ], [ %best_count.025, %lor.lhs.false ]
66 %indvars.iv.next.454 = add nsw i64 %indvars.iv, 5
67 %tmp22 = trunc i64 %indvars.iv.next.454 to i32
68 %cmp1.5 = icmp eq i32 %tmp22, %K1
69 br i1 %cmp1.5, label %for.end, label %for.body.6
70
71; CHECK: Flow2:
72; CHECK: br i1 %{{[0-9]+}}, label %for.end, label %for.body
73
74; CHECK: for.body.6:
75; CHECK: br i1 %cmp5.6, label %if.then6.6, label %for.body.backedge
76for.body.6: ; preds = %for.body.1
77 %indvars.iv.next.559 = add nsw i64 %indvars.iv, 6
78 %tmp26 = trunc i64 %indvars.iv.next.559 to i32
79 %sub4.6 = sub nsw i32 %tmp26, %tmp22
80 %cmp5.6 = icmp slt i32 %best_count.231, %sub4.6
81 br i1 %cmp5.6, label %if.then6.6, label %for.body.backedge
82
83; CHECK: if.then6.6
84; CHECK: br label %for.body.backedge
85if.then6.6: ; preds = %for.body.6
David Blaikie79e6c742015-02-27 19:29:02 +000086 %arrayidx8.6 = getelementptr inbounds float, float* %nr, i64 %indvars.iv.next.454
David Blaikiea79ac142015-02-27 21:17:42 +000087 %tmp29 = load float, float* %arrayidx8.6, align 4
Tom Stellard071ec902015-02-04 20:49:44 +000088 br label %for.body.backedge
89
90; CHECK: Flow3:
91; CHECK: br label %Flow2
92
93; CHECK: for.body.backedge:
94; CHECK: br label %Flow3
95for.body.backedge: ; preds = %if.then6.6, %for.body.6
96 %best_val.027.be = phi float [ %tmp29, %if.then6.6 ], [ %best_val.233, %for.body.6 ]
97 %best_count.025.be = phi i32 [ %sub4.6, %if.then6.6 ], [ %best_count.231, %for.body.6 ]
98 %indvars.iv.be = add nsw i64 %indvars.iv, 7
99 br label %for.body
100}