ephemeral.ll 898 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. ; RUN: opt < %s -loop-reduce -S | FileCheck %s
  2. target datalayout = "e-i64:64-v16:16-v32:32-n16:32:64"
  3. ; for (int i = 0; i < n; ++i) {
  4. ; use(i * 5 + 3);
  5. ; // i * a + b is ephemeral and shouldn't be promoted by LSR
  6. ; __builtin_assume(i * a + b >= 0);
  7. ; }
  8. define void @ephemeral(i32 %a, i32 %b, i32 %n) {
  9. ; CHECK-LABEL: @ephemeral(
  10. entry:
  11. br label %loop
  12. loop:
  13. %i = phi i32 [ 0, %entry ], [ %inc, %loop ]
  14. ; Only i and i * 5 + 3 should be indvars, not i * a + b.
  15. ; CHECK: phi i32
  16. ; CHECK: phi i32
  17. ; CHECK-NOT: phi i32
  18. %inc = add nsw i32 %i, 1
  19. %exitcond = icmp eq i32 %inc, %n
  20. %0 = mul nsw i32 %i, 5
  21. %1 = add nsw i32 %0, 3
  22. call void @use(i32 %1)
  23. %2 = mul nsw i32 %i, %a
  24. %3 = add nsw i32 %2, %b
  25. %4 = icmp sgt i32 %3, -1
  26. call void @llvm.assume(i1 %4)
  27. br i1 %exitcond, label %exit, label %loop
  28. exit:
  29. ret void
  30. }
  31. declare void @use(i32)
  32. declare void @llvm.assume(i1)