reduction.ll 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. ; RUN: opt < %s -loop-reroll -S | FileCheck %s
  2. target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
  3. target triple = "x86_64-unknown-linux-gnu"
  4. define i32 @foo(i32* nocapture readonly %x) #0 {
  5. entry:
  6. br label %for.body
  7. for.body: ; preds = %entry, %for.body
  8. %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
  9. %r.029 = phi i32 [ 0, %entry ], [ %add12, %for.body ]
  10. %arrayidx = getelementptr inbounds i32, i32* %x, i64 %indvars.iv
  11. %0 = load i32, i32* %arrayidx, align 4
  12. %add = add nsw i32 %0, %r.029
  13. %1 = or i64 %indvars.iv, 1
  14. %arrayidx3 = getelementptr inbounds i32, i32* %x, i64 %1
  15. %2 = load i32, i32* %arrayidx3, align 4
  16. %add4 = add nsw i32 %add, %2
  17. %3 = or i64 %indvars.iv, 2
  18. %arrayidx7 = getelementptr inbounds i32, i32* %x, i64 %3
  19. %4 = load i32, i32* %arrayidx7, align 4
  20. %add8 = add nsw i32 %add4, %4
  21. %5 = or i64 %indvars.iv, 3
  22. %arrayidx11 = getelementptr inbounds i32, i32* %x, i64 %5
  23. %6 = load i32, i32* %arrayidx11, align 4
  24. %add12 = add nsw i32 %add8, %6
  25. %indvars.iv.next = add nuw nsw i64 %indvars.iv, 4
  26. %7 = trunc i64 %indvars.iv.next to i32
  27. %cmp = icmp slt i32 %7, 400
  28. br i1 %cmp, label %for.body, label %for.end
  29. ; CHECK-LABEL: @foo
  30. ; CHECK: for.body:
  31. ; CHECK: %indvar = phi i64 [ %indvar.next, %for.body ], [ 0, %entry ]
  32. ; CHECK: %r.029 = phi i32 [ 0, %entry ], [ %add, %for.body ]
  33. ; CHECK: %arrayidx = getelementptr inbounds i32, i32* %x, i64 %indvar
  34. ; CHECK: %0 = load i32, i32* %arrayidx, align 4
  35. ; CHECK: %add = add nsw i32 %0, %r.029
  36. ; CHECK: %indvar.next = add i64 %indvar, 1
  37. ; CHECK: %exitcond = icmp eq i64 %indvar, 399
  38. ; CHECK: br i1 %exitcond, label %for.end, label %for.body
  39. ; CHECK: ret
  40. for.end: ; preds = %for.body
  41. ret i32 %add12
  42. }
  43. define float @bar(float* nocapture readonly %x) #0 {
  44. entry:
  45. br label %for.body
  46. for.body: ; preds = %entry, %for.body
  47. %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
  48. %r.029 = phi float [ 0.0, %entry ], [ %add12, %for.body ]
  49. %arrayidx = getelementptr inbounds float, float* %x, i64 %indvars.iv
  50. %0 = load float, float* %arrayidx, align 4
  51. %add = fadd float %0, %r.029
  52. %1 = or i64 %indvars.iv, 1
  53. %arrayidx3 = getelementptr inbounds float, float* %x, i64 %1
  54. %2 = load float, float* %arrayidx3, align 4
  55. %add4 = fadd float %add, %2
  56. %3 = or i64 %indvars.iv, 2
  57. %arrayidx7 = getelementptr inbounds float, float* %x, i64 %3
  58. %4 = load float, float* %arrayidx7, align 4
  59. %add8 = fadd float %add4, %4
  60. %5 = or i64 %indvars.iv, 3
  61. %arrayidx11 = getelementptr inbounds float, float* %x, i64 %5
  62. %6 = load float, float* %arrayidx11, align 4
  63. %add12 = fadd float %add8, %6
  64. %indvars.iv.next = add nuw nsw i64 %indvars.iv, 4
  65. %7 = trunc i64 %indvars.iv.next to i32
  66. %cmp = icmp slt i32 %7, 400
  67. br i1 %cmp, label %for.body, label %for.end
  68. ; CHECK-LABEL: @bar
  69. ; CHECK: for.body:
  70. ; CHECK: %indvar = phi i64 [ %indvar.next, %for.body ], [ 0, %entry ]
  71. ; CHECK: %r.029 = phi float [ 0.000000e+00, %entry ], [ %add, %for.body ]
  72. ; CHECK: %arrayidx = getelementptr inbounds float, float* %x, i64 %indvar
  73. ; CHECK: %0 = load float, float* %arrayidx, align 4
  74. ; CHECK: %add = fadd float %0, %r.029
  75. ; CHECK: %indvar.next = add i64 %indvar, 1
  76. ; CHECK: %exitcond = icmp eq i64 %indvar, 399
  77. ; CHECK: br i1 %exitcond, label %for.end, label %for.body
  78. ; CHECK: ret
  79. for.end: ; preds = %for.body
  80. ret float %add12
  81. }
  82. define i32 @foo_unusedphi(i32* nocapture readonly %x) #0 {
  83. entry:
  84. br label %for.body
  85. for.body: ; preds = %entry, %for.body
  86. %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
  87. %r.029 = phi i32 [ 0, %entry ], [ %add12, %for.body ]
  88. %arrayidx = getelementptr inbounds i32, i32* %x, i64 %indvars.iv
  89. %0 = load i32, i32* %arrayidx, align 4
  90. %add = add nsw i32 %0, %0
  91. %1 = or i64 %indvars.iv, 1
  92. %arrayidx3 = getelementptr inbounds i32, i32* %x, i64 %1
  93. %2 = load i32, i32* %arrayidx3, align 4
  94. %add4 = add nsw i32 %add, %2
  95. %3 = or i64 %indvars.iv, 2
  96. %arrayidx7 = getelementptr inbounds i32, i32* %x, i64 %3
  97. %4 = load i32, i32* %arrayidx7, align 4
  98. %add8 = add nsw i32 %add4, %4
  99. %5 = or i64 %indvars.iv, 3
  100. %arrayidx11 = getelementptr inbounds i32, i32* %x, i64 %5
  101. %6 = load i32, i32* %arrayidx11, align 4
  102. %add12 = add nsw i32 %add8, %6
  103. %indvars.iv.next = add nuw nsw i64 %indvars.iv, 4
  104. %7 = trunc i64 %indvars.iv.next to i32
  105. %cmp = icmp slt i32 %7, 400
  106. br i1 %cmp, label %for.body, label %for.end
  107. ; CHECK-LABEL: @foo_unusedphi
  108. ; The above is just testing for a crash - no specific output expected.
  109. ; CHECK: ret
  110. for.end: ; preds = %for.body
  111. ret i32 %add12
  112. }
  113. attributes #0 = { nounwind readonly uwtable }