phi-and-select.ll 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. ; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
  2. ; BasicAA should detect NoAliases in PHIs and Selects.
  3. ; CHECK: Function: foo
  4. ; CHECK: NoAlias: double* %a, double* %b
  5. ; CHECK: Function: bar
  6. ; CHECK: NoAlias: double* %a, double* %b
  7. ; CHECK: Function: qux
  8. ; CHECK: NoAlias: double* %a, double* %b
  9. ; CHECK: Function: fin
  10. ; CHECK: NoAlias: double* %a, double* %b
  11. ; CHECK: ===== Alias Analysis Evaluator Report =====
  12. ; Two PHIs in the same block.
  13. define void @foo(i1 %m, double* noalias %x, double* noalias %y) {
  14. entry:
  15. br i1 %m, label %true, label %false
  16. true:
  17. br label %exit
  18. false:
  19. br label %exit
  20. exit:
  21. %a = phi double* [ %x, %true ], [ %y, %false ]
  22. %b = phi double* [ %x, %false ], [ %y, %true ]
  23. store volatile double 0.0, double* %a
  24. store volatile double 1.0, double* %b
  25. ret void
  26. }
  27. ; Two selects with the same condition.
  28. define void @bar(i1 %m, double* noalias %x, double* noalias %y) {
  29. entry:
  30. %a = select i1 %m, double* %x, double* %y
  31. %b = select i1 %m, double* %y, double* %x
  32. store volatile double 0.000000e+00, double* %a
  33. store volatile double 1.000000e+00, double* %b
  34. ret void
  35. }
  36. ; Two PHIs with disjoint sets of inputs.
  37. define void @qux(i1 %m, double* noalias %x, double* noalias %y,
  38. i1 %n, double* noalias %v, double* noalias %w) {
  39. entry:
  40. br i1 %m, label %true, label %false
  41. true:
  42. br label %exit
  43. false:
  44. br label %exit
  45. exit:
  46. %a = phi double* [ %x, %true ], [ %y, %false ]
  47. br i1 %n, label %ntrue, label %nfalse
  48. ntrue:
  49. br label %nexit
  50. nfalse:
  51. br label %nexit
  52. nexit:
  53. %b = phi double* [ %v, %ntrue ], [ %w, %nfalse ]
  54. store volatile double 0.0, double* %a
  55. store volatile double 1.0, double* %b
  56. ret void
  57. }
  58. ; Two selects with disjoint sets of arms.
  59. define void @fin(i1 %m, double* noalias %x, double* noalias %y,
  60. i1 %n, double* noalias %v, double* noalias %w) {
  61. entry:
  62. %a = select i1 %m, double* %x, double* %y
  63. %b = select i1 %n, double* %v, double* %w
  64. store volatile double 0.000000e+00, double* %a
  65. store volatile double 1.000000e+00, double* %b
  66. ret void
  67. }