sink_instruction.ll 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. ; RUN: opt -instcombine -S < %s | FileCheck %s
  2. ;; This tests that the instructions in the entry blocks are sunk into each
  3. ;; arm of the 'if'.
  4. define i32 @test1(i1 %C, i32 %A, i32 %B) {
  5. ; CHECK-LABEL: @test1(
  6. entry:
  7. %tmp.2 = sdiv i32 %A, %B ; <i32> [#uses=1]
  8. %tmp.9 = add i32 %B, %A ; <i32> [#uses=1]
  9. br i1 %C, label %then, label %endif
  10. then: ; preds = %entry
  11. ret i32 %tmp.9
  12. endif: ; preds = %entry
  13. ; CHECK: sdiv i32
  14. ; CHECK-NEXT: ret i32
  15. ret i32 %tmp.2
  16. }
  17. ;; PHI use, sink divide before call.
  18. define i32 @test2(i32 %x) nounwind ssp {
  19. ; CHECK-LABEL: @test2(
  20. ; CHECK-NOT: sdiv i32
  21. entry:
  22. br label %bb
  23. bb: ; preds = %bb2, %entry
  24. %x_addr.17 = phi i32 [ %x, %entry ], [ %x_addr.0, %bb2 ] ; <i32> [#uses=4]
  25. %i.06 = phi i32 [ 0, %entry ], [ %4, %bb2 ] ; <i32> [#uses=1]
  26. %0 = add nsw i32 %x_addr.17, 1 ; <i32> [#uses=1]
  27. %1 = sdiv i32 %0, %x_addr.17 ; <i32> [#uses=1]
  28. %2 = icmp eq i32 %x_addr.17, 0 ; <i1> [#uses=1]
  29. br i1 %2, label %bb1, label %bb2
  30. bb1: ; preds = %bb
  31. ; CHECK: bb1:
  32. ; CHECK-NEXT: add nsw i32 %x_addr.17, 1
  33. ; CHECK-NEXT: sdiv i32
  34. ; CHECK-NEXT: tail call i32 @bar()
  35. %3 = tail call i32 @bar() nounwind ; <i32> [#uses=0]
  36. br label %bb2
  37. bb2: ; preds = %bb, %bb1
  38. %x_addr.0 = phi i32 [ %1, %bb1 ], [ %x_addr.17, %bb ] ; <i32> [#uses=2]
  39. %4 = add nsw i32 %i.06, 1 ; <i32> [#uses=2]
  40. %exitcond = icmp eq i32 %4, 1000000 ; <i1> [#uses=1]
  41. br i1 %exitcond, label %bb4, label %bb
  42. bb4: ; preds = %bb2
  43. ret i32 %x_addr.0
  44. }
  45. declare i32 @bar()