Tom Stellard | 071ec90 | 2015-02-04 20:49:44 +0000 | [diff] [blame] | 1 | ; 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 |
| 10 | define void @test(float* nocapture %out, i32 %K1, float* nocapture readonly %nr) { |
| 11 | |
| 12 | ; CHECK: entry: |
| 13 | ; CHECK: br label %for.body |
| 14 | entry: |
| 15 | br label %for.body |
| 16 | |
| 17 | ; CHECK: for.body: |
| 18 | ; CHECK: br i1 %{{[0-9]+}}, label %lor.lhs.false, label %Flow |
| 19 | for.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 |
| 30 | lor.lhs.false: ; preds = %for.body |
David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 31 | %arrayidx = getelementptr inbounds float, float* %nr, i64 %indvars.iv |
David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 32 | %tmp1 = load float, float* %arrayidx, align 4 |
Tom Stellard | 071ec90 | 2015-02-04 20:49:44 +0000 | [diff] [blame] | 33 | %tmp2 = add nsw i64 %indvars.iv, -1 |
David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 34 | %arrayidx2 = getelementptr inbounds float, float* %nr, i64 %tmp2 |
David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 35 | %tmp3 = load float, float* %arrayidx2, align 4 |
Tom Stellard | 071ec90 | 2015-02-04 20:49:44 +0000 | [diff] [blame] | 36 | %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 |
| 44 | if.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 Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 47 | %arrayidx8 = getelementptr inbounds float, float* %nr, i64 %tmp4 |
David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 48 | %tmp5 = load float, float* %arrayidx8, align 4 |
Tom Stellard | 071ec90 | 2015-02-04 20:49:44 +0000 | [diff] [blame] | 49 | br i1 %cmp1, label %for.end, label %for.body.1 |
| 50 | |
| 51 | ; CHECK: for.end: |
| 52 | ; CHECK: ret void |
| 53 | for.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 |
| 63 | for.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 |
| 76 | for.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 |
| 85 | if.then6.6: ; preds = %for.body.6 |
David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 86 | %arrayidx8.6 = getelementptr inbounds float, float* %nr, i64 %indvars.iv.next.454 |
David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 87 | %tmp29 = load float, float* %arrayidx8.6, align 4 |
Tom Stellard | 071ec90 | 2015-02-04 20:49:44 +0000 | [diff] [blame] | 88 | 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 |
| 95 | for.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 | } |