2
0

reverse_iter.ll 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. ; RUN: opt < %s -loop-vectorize -force-vector-interleave=1 -force-vector-width=4 -dce -instcombine -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-apple-macosx10.8.0"
  4. ; Make sure that the reverse iterators are calculated using 64bit arithmetic, not 32.
  5. ;
  6. ; int foo(int n, int *A) {
  7. ; int sum;
  8. ; for (int i=n; i > 0; i--)
  9. ; sum += A[i*2];
  10. ; return sum;
  11. ; }
  12. ;
  13. ;CHECK-LABEL: @foo(
  14. ;CHECK: <i64 0, i64 -1, i64 -2, i64 -3>
  15. ;CHECK: ret
  16. define i32 @foo(i32 %n, i32* nocapture %A) {
  17. %1 = icmp sgt i32 %n, 0
  18. br i1 %1, label %.lr.ph, label %._crit_edge
  19. .lr.ph: ; preds = %0
  20. %2 = sext i32 %n to i64
  21. br label %3
  22. ; <label>:3 ; preds = %.lr.ph, %3
  23. %indvars.iv = phi i64 [ %2, %.lr.ph ], [ %indvars.iv.next, %3 ]
  24. %sum.01 = phi i32 [ undef, %.lr.ph ], [ %9, %3 ]
  25. %4 = trunc i64 %indvars.iv to i32
  26. %5 = shl nsw i32 %4, 1
  27. %6 = sext i32 %5 to i64
  28. %7 = getelementptr inbounds i32, i32* %A, i64 %6
  29. %8 = load i32, i32* %7, align 4
  30. %9 = add nsw i32 %8, %sum.01
  31. %indvars.iv.next = add i64 %indvars.iv, -1
  32. %10 = trunc i64 %indvars.iv.next to i32
  33. %11 = icmp sgt i32 %10, 0
  34. br i1 %11, label %3, label %._crit_edge
  35. ._crit_edge: ; preds = %3, %0
  36. %sum.0.lcssa = phi i32 [ undef, %0 ], [ %9, %3 ]
  37. ret i32 %sum.0.lcssa
  38. }