post-order-traversal-bug.ll 4.1 KB

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