nonconst_lb.ll 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. ; RUN: opt < %s -loop-reroll -S | FileCheck %s
  2. target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32"
  3. target triple = "thumbv7-none-linux"
  4. ;void foo(int *A, int *B, int m, int n) {
  5. ; for (int i = m; i < n; i+=4) {
  6. ; A[i+0] = B[i+0] * 4;
  7. ; A[i+1] = B[i+1] * 4;
  8. ; A[i+2] = B[i+2] * 4;
  9. ; A[i+3] = B[i+3] * 4;
  10. ; }
  11. ;}
  12. define void @foo(i32* nocapture %A, i32* nocapture readonly %B, i32 %m, i32 %n) {
  13. entry:
  14. %cmp34 = icmp slt i32 %m, %n
  15. br i1 %cmp34, label %for.body, label %for.end
  16. for.body: ; preds = %entry, %for.body
  17. %i.035 = phi i32 [ %add18, %for.body ], [ %m, %entry ]
  18. %arrayidx = getelementptr inbounds i32, i32* %B, i32 %i.035
  19. %0 = load i32, i32* %arrayidx, align 4
  20. %mul = shl nsw i32 %0, 2
  21. %arrayidx2 = getelementptr inbounds i32, i32* %A, i32 %i.035
  22. store i32 %mul, i32* %arrayidx2, align 4
  23. %add3 = add nsw i32 %i.035, 1
  24. %arrayidx4 = getelementptr inbounds i32, i32* %B, i32 %add3
  25. %1 = load i32, i32* %arrayidx4, align 4
  26. %mul5 = shl nsw i32 %1, 2
  27. %arrayidx7 = getelementptr inbounds i32, i32* %A, i32 %add3
  28. store i32 %mul5, i32* %arrayidx7, align 4
  29. %add8 = add nsw i32 %i.035, 2
  30. %arrayidx9 = getelementptr inbounds i32, i32* %B, i32 %add8
  31. %2 = load i32, i32* %arrayidx9, align 4
  32. %mul10 = shl nsw i32 %2, 2
  33. %arrayidx12 = getelementptr inbounds i32, i32* %A, i32 %add8
  34. store i32 %mul10, i32* %arrayidx12, align 4
  35. %add13 = add nsw i32 %i.035, 3
  36. %arrayidx14 = getelementptr inbounds i32, i32* %B, i32 %add13
  37. %3 = load i32, i32* %arrayidx14, align 4
  38. %mul15 = shl nsw i32 %3, 2
  39. %arrayidx17 = getelementptr inbounds i32, i32* %A, i32 %add13
  40. store i32 %mul15, i32* %arrayidx17, align 4
  41. %add18 = add nsw i32 %i.035, 4
  42. %cmp = icmp slt i32 %add18, %n
  43. br i1 %cmp, label %for.body, label %for.end
  44. for.end: ; preds = %for.body, %entry
  45. ret void
  46. }
  47. ; CHECK-LABEL: @foo
  48. ; CHECK: for.body.preheader: ; preds = %entry
  49. ; CHECK: %0 = add i32 %n, -1
  50. ; CHECK: %1 = sub i32 %0, %m
  51. ; CHECK: %2 = lshr i32 %1, 2
  52. ; CHECK: %3 = shl i32 %2, 2
  53. ; CHECK: %4 = add i32 %m, %3
  54. ; CHECK: %5 = add i32 %4, 3
  55. ; CHECK: br label %for.body
  56. ; CHECK: for.body: ; preds = %for.body, %for.body.preheader
  57. ; CHECK: %indvar = phi i32 [ %indvar.next, %for.body ], [ 0, %for.body.preheader ]
  58. ; CHECK: %6 = add i32 %m, %indvar
  59. ; CHECK: %arrayidx = getelementptr inbounds i32, i32* %B, i32 %6
  60. ; CHECK: %7 = load i32, i32* %arrayidx, align 4
  61. ; CHECK: %mul = shl nsw i32 %7, 2
  62. ; CHECK: %arrayidx2 = getelementptr inbounds i32, i32* %A, i32 %6
  63. ; CHECK: store i32 %mul, i32* %arrayidx2, align 4
  64. ; CHECK: %indvar.next = add i32 %indvar, 1
  65. ; CHECK: %exitcond = icmp eq i32 %6, %5
  66. ; CHECK: br i1 %exitcond, label %for.end, label %for.body
  67. ;void daxpy_ur(int n,float da,float *dx,float *dy)
  68. ; {
  69. ; int m = n % 4;
  70. ; for (int i = m; i < n; i = i + 4)
  71. ; {
  72. ; dy[i] = dy[i] + da*dx[i];
  73. ; dy[i+1] = dy[i+1] + da*dx[i+1];
  74. ; dy[i+2] = dy[i+2] + da*dx[i+2];
  75. ; dy[i+3] = dy[i+3] + da*dx[i+3];
  76. ; }
  77. ; }
  78. define void @daxpy_ur(i32 %n, float %da, float* nocapture readonly %dx, float* nocapture %dy) {
  79. entry:
  80. %rem = srem i32 %n, 4
  81. %cmp55 = icmp slt i32 %rem, %n
  82. br i1 %cmp55, label %for.body, label %for.end
  83. for.body: ; preds = %entry, %for.body
  84. %i.056 = phi i32 [ %add27, %for.body ], [ %rem, %entry ]
  85. %arrayidx = getelementptr inbounds float, float* %dy, i32 %i.056
  86. %0 = load float, float* %arrayidx, align 4
  87. %arrayidx1 = getelementptr inbounds float, float* %dx, i32 %i.056
  88. %1 = load float, float* %arrayidx1, align 4
  89. %mul = fmul float %1, %da
  90. %add = fadd float %0, %mul
  91. store float %add, float* %arrayidx, align 4
  92. %add3 = add nsw i32 %i.056, 1
  93. %arrayidx4 = getelementptr inbounds float, float* %dy, i32 %add3
  94. %2 = load float, float* %arrayidx4, align 4
  95. %arrayidx6 = getelementptr inbounds float, float* %dx, i32 %add3
  96. %3 = load float, float* %arrayidx6, align 4
  97. %mul7 = fmul float %3, %da
  98. %add8 = fadd float %2, %mul7
  99. store float %add8, float* %arrayidx4, align 4
  100. %add11 = add nsw i32 %i.056, 2
  101. %arrayidx12 = getelementptr inbounds float, float* %dy, i32 %add11
  102. %4 = load float, float* %arrayidx12, align 4
  103. %arrayidx14 = getelementptr inbounds float, float* %dx, i32 %add11
  104. %5 = load float, float* %arrayidx14, align 4
  105. %mul15 = fmul float %5, %da
  106. %add16 = fadd float %4, %mul15
  107. store float %add16, float* %arrayidx12, align 4
  108. %add19 = add nsw i32 %i.056, 3
  109. %arrayidx20 = getelementptr inbounds float, float* %dy, i32 %add19
  110. %6 = load float, float* %arrayidx20, align 4
  111. %arrayidx22 = getelementptr inbounds float, float* %dx, i32 %add19
  112. %7 = load float, float* %arrayidx22, align 4
  113. %mul23 = fmul float %7, %da
  114. %add24 = fadd float %6, %mul23
  115. store float %add24, float* %arrayidx20, align 4
  116. %add27 = add nsw i32 %i.056, 4
  117. %cmp = icmp slt i32 %add27, %n
  118. br i1 %cmp, label %for.body, label %for.end
  119. for.end: ; preds = %for.body, %entry
  120. ret void
  121. }
  122. ; CHECK-LABEL: @daxpy_ur
  123. ; CHECK: for.body.preheader:
  124. ; CHECK: %0 = add i32 %n, -1
  125. ; CHECK: %1 = sub i32 %0, %rem
  126. ; CHECK: %2 = lshr i32 %1, 2
  127. ; CHECK: %3 = shl i32 %2, 2
  128. ; CHECK: %4 = add i32 %rem, %3
  129. ; CHECK: %5 = add i32 %4, 3
  130. ; CHECK: br label %for.body
  131. ; CHECK: for.body:
  132. ; CHECK: %indvar = phi i32 [ %indvar.next, %for.body ], [ 0, %for.body.preheader ]
  133. ; CHECK: %6 = add i32 %rem, %indvar
  134. ; CHECK: %arrayidx = getelementptr inbounds float, float* %dy, i32 %6
  135. ; CHECK: %7 = load float, float* %arrayidx, align 4
  136. ; CHECK: %arrayidx1 = getelementptr inbounds float, float* %dx, i32 %6
  137. ; CHECK: %8 = load float, float* %arrayidx1, align 4
  138. ; CHECK: %mul = fmul float %8, %da
  139. ; CHECK: %add = fadd float %7, %mul
  140. ; CHECK: store float %add, float* %arrayidx, align 4
  141. ; CHECK: %indvar.next = add i32 %indvar, 1
  142. ; CHECK: %exitcond = icmp eq i32 %6, %5
  143. ; CHECK: br i1 %exitcond, label %for.end, label %for.body