Home | History | Annotate | Download | only in StructurizeCFG
      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
     31   %arrayidx = getelementptr inbounds float, float* %nr, i64 %indvars.iv
     32   %tmp1 = load float, float* %arrayidx, align 4
     33   %tmp2 = add nsw i64 %indvars.iv, -1
     34   %arrayidx2 = getelementptr inbounds float, float* %nr, i64 %tmp2
     35   %tmp3 = load float, float* %arrayidx2, align 4
     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
     47   %arrayidx8 = getelementptr inbounds float, float* %nr, i64 %tmp4
     48   %tmp5 = load float, float* %arrayidx8, align 4
     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
     86   %arrayidx8.6 = getelementptr inbounds float, float* %nr, i64 %indvars.iv.next.454
     87   %tmp29 = load float, float* %arrayidx8.6, align 4
     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 }
    101