scev.ll 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. ; RUN: opt -O3 -S -analyze -scalar-evolution < %s | FileCheck %s
  2. ;
  3. ; This file contains phase ordering tests for scalar evolution.
  4. ; Test that the standard passes don't obfuscate the IR so scalar evolution can't
  5. ; recognize expressions.
  6. ; CHECK: test1
  7. ; The loop body contains two increments by %div.
  8. ; Make sure that 2*%div is recognizable, and not expressed as a bit mask of %d.
  9. ; CHECK: --> {%p,+,(8 * (%d /u 4))}
  10. define void @test1(i64 %d, i32* %p) nounwind uwtable ssp {
  11. entry:
  12. %div = udiv i64 %d, 4
  13. br label %for.cond
  14. for.cond: ; preds = %for.inc, %entry
  15. %p.addr.0 = phi i32* [ %p, %entry ], [ %add.ptr1, %for.inc ]
  16. %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
  17. %cmp = icmp ne i32 %i.0, 64
  18. br i1 %cmp, label %for.body, label %for.end
  19. for.body: ; preds = %for.cond
  20. store i32 0, i32* %p.addr.0, align 4
  21. %add.ptr = getelementptr inbounds i32, i32* %p.addr.0, i64 %div
  22. store i32 1, i32* %add.ptr, align 4
  23. %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i64 %div
  24. br label %for.inc
  25. for.inc: ; preds = %for.body
  26. %inc = add i32 %i.0, 1
  27. br label %for.cond
  28. for.end: ; preds = %for.cond
  29. ret void
  30. }
  31. ; CHECK: test1a
  32. ; Same thing as test1, but it is even more tempting to fold 2 * (%d /u 2)
  33. ; CHECK: --> {%p,+,(8 * (%d /u 2))}
  34. define void @test1a(i64 %d, i32* %p) nounwind uwtable ssp {
  35. entry:
  36. %div = udiv i64 %d, 2
  37. br label %for.cond
  38. for.cond: ; preds = %for.inc, %entry
  39. %p.addr.0 = phi i32* [ %p, %entry ], [ %add.ptr1, %for.inc ]
  40. %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
  41. %cmp = icmp ne i32 %i.0, 64
  42. br i1 %cmp, label %for.body, label %for.end
  43. for.body: ; preds = %for.cond
  44. store i32 0, i32* %p.addr.0, align 4
  45. %add.ptr = getelementptr inbounds i32, i32* %p.addr.0, i64 %div
  46. store i32 1, i32* %add.ptr, align 4
  47. %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i64 %div
  48. br label %for.inc
  49. for.inc: ; preds = %for.body
  50. %inc = add i32 %i.0, 1
  51. br label %for.cond
  52. for.end: ; preds = %for.cond
  53. ret void
  54. }