reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
; RUN: opt -S -structurizecfg %s -o - | FileCheck %s

; The structurize cfg pass used to do a post-order traversal to generate a list
; of ; basic blocks and then operate on the list in reverse.  This led to bugs,
; because sometimes successors would be visited before their predecessors.
; The fix for this was to do a reverse post-order traversal which is what the
; algorithm requires.

; Function Attrs: nounwind
define void @test(float* nocapture %out, i32 %K1, float* nocapture readonly %nr) {

; CHECK: entry:
; CHECK: br label %for.body
entry:
  br label %for.body

; CHECK: for.body:
; CHECK: br i1 %{{[0-9]+}}, label %lor.lhs.false, label %Flow
for.body:                                         ; preds = %for.body.backedge, %entry
  %indvars.iv = phi i64 [ %indvars.iv.be, %for.body.backedge ], [ 1, %entry ]
  %best_val.027 = phi float [ %best_val.027.be, %for.body.backedge ], [ 5.000000e+01, %entry ]
  %prev_start.026 = phi i32 [ %tmp26, %for.body.backedge ], [ 0, %entry ]
  %best_count.025 = phi i32 [ %best_count.025.be, %for.body.backedge ], [ 0, %entry ]
  %tmp0 = trunc i64 %indvars.iv to i32
  %cmp1 = icmp eq i32 %tmp0, %K1
  br i1 %cmp1, label %if.then, label %lor.lhs.false

; CHECK: lor.lhs.false:
; CHECK: br label %Flow
lor.lhs.false:                                    ; preds = %for.body
  %arrayidx = getelementptr inbounds float, float* %nr, i64 %indvars.iv
  %tmp1 = load float, float* %arrayidx, align 4
  %tmp2 = add nsw i64 %indvars.iv, -1
  %arrayidx2 = getelementptr inbounds float, float* %nr, i64 %tmp2
  %tmp3 = load float, float* %arrayidx2, align 4
  %cmp3 = fcmp une float %tmp1, %tmp3
  br i1 %cmp3, label %if.then, label %for.body.1

; CHECK: Flow:
; CHECK: br i1 %{{[0-9]+}}, label %if.then, label %Flow1

; CHECK: if.then:
; CHECK: br label %Flow1
if.then:                                          ; preds = %lor.lhs.false, %for.body
  %sub4 = sub nsw i32 %tmp0, %prev_start.026
  %tmp4 = add nsw i64 %indvars.iv, -1
  %arrayidx8 = getelementptr inbounds float, float* %nr, i64 %tmp4
  %tmp5 = load float, float* %arrayidx8, align 4
  br i1 %cmp1, label %for.end, label %for.body.1

; CHECK: for.end:
; CHECK: ret void
for.end:                                          ; preds = %for.body.1, %if.then
  %best_val.0.lcssa = phi float [ %best_val.233, %for.body.1 ], [ %tmp5, %if.then ]
  store float %best_val.0.lcssa, float* %out, align 4
  ret void

; CHECK: Flow1
; CHECK: br i1 %{{[0-9]}}, label %for.body.1, label %Flow2

; CHECK: for.body.1:
; CHECK: br i1 %{{[0-9]+}}, label %for.body.6, label %Flow3
for.body.1:                                       ; preds = %if.then, %lor.lhs.false
  %best_val.233 = phi float [ %tmp5, %if.then ], [ %best_val.027, %lor.lhs.false ]
  %best_count.231 = phi i32 [ %sub4, %if.then ], [ %best_count.025, %lor.lhs.false ]
  %indvars.iv.next.454 = add nsw i64 %indvars.iv, 5
  %tmp22 = trunc i64 %indvars.iv.next.454 to i32
  %cmp1.5 = icmp eq i32 %tmp22, %K1
  br i1 %cmp1.5, label %for.end, label %for.body.6

; CHECK: Flow2:
; CHECK: br i1 %{{[0-9]+}}, label %for.end, label %for.body

; CHECK: for.body.6:
; CHECK: br i1 %cmp5.6, label %if.then6.6, label %for.body.backedge
for.body.6:                                       ; preds = %for.body.1
  %indvars.iv.next.559 = add nsw i64 %indvars.iv, 6
  %tmp26 = trunc i64 %indvars.iv.next.559 to i32
  %sub4.6 = sub nsw i32 %tmp26, %tmp22
  %cmp5.6 = icmp slt i32 %best_count.231, %sub4.6
  br i1 %cmp5.6, label %if.then6.6, label %for.body.backedge

; CHECK: if.then6.6
; CHECK: br label %for.body.backedge
if.then6.6:                                       ; preds = %for.body.6
  %arrayidx8.6 = getelementptr inbounds float, float* %nr, i64 %indvars.iv.next.454
  %tmp29 = load float, float* %arrayidx8.6, align 4
  br label %for.body.backedge

; CHECK: Flow3:
; CHECK: br label %Flow2

; CHECK: for.body.backedge:
; CHECK: br label %Flow3
for.body.backedge:                                ; preds = %if.then6.6, %for.body.6
  %best_val.027.be = phi float [ %tmp29, %if.then6.6 ], [ %best_val.233, %for.body.6 ]
  %best_count.025.be = phi i32 [ %sub4.6, %if.then6.6 ], [ %best_count.231, %for.body.6 ]
  %indvars.iv.be = add nsw i64 %indvars.iv, 7
  br label %for.body
}