speculate-with-offset.ll 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. ; RUN: opt -simplifycfg -S < %s | FileCheck %s
  2. ; This load is safe to speculate, as it's from a safe offset
  3. ; within an alloca.
  4. ; CHECK-LABEL: @yes(
  5. ; CHECK-NOT: br
  6. define void @yes(i1 %c) nounwind {
  7. entry:
  8. %a = alloca [4 x i64*], align 8
  9. %__a.addr = getelementptr [4 x i64*], [4 x i64*]* %a, i64 0, i64 3
  10. call void @frob(i64** %__a.addr)
  11. br i1 %c, label %if.then, label %if.end
  12. if.then: ; preds = %entry
  13. br label %return
  14. if.end: ; preds = %entry
  15. %tmp5 = load i64*, i64** %__a.addr, align 8
  16. br label %return
  17. return: ; preds = %if.end, %if.then
  18. %storemerge = phi i64* [ undef, %if.then ], [ %tmp5, %if.end ]
  19. ret void
  20. }
  21. ; CHECK-LABEL: @no0(
  22. ; CHECK: br i1 %c
  23. define void @no0(i1 %c) nounwind {
  24. entry:
  25. %a = alloca [4 x i64*], align 8
  26. %__a.addr = getelementptr [4 x i64*], [4 x i64*]* %a, i64 0, i64 4
  27. call void @frob(i64** %__a.addr)
  28. br i1 %c, label %if.then, label %if.end
  29. if.then: ; preds = %entry
  30. br label %return
  31. if.end: ; preds = %entry
  32. %tmp5 = load i64*, i64** %__a.addr, align 8
  33. br label %return
  34. return: ; preds = %if.end, %if.then
  35. %storemerge = phi i64* [ undef, %if.then ], [ %tmp5, %if.end ]
  36. ret void
  37. }
  38. ; CHECK-LABEL: @no1(
  39. ; CHECK: br i1 %c
  40. define void @no1(i1 %c, i64 %n) nounwind {
  41. entry:
  42. %a = alloca [4 x i64*], align 8
  43. %__a.addr = getelementptr [4 x i64*], [4 x i64*]* %a, i64 0, i64 %n
  44. call void @frob(i64** %__a.addr)
  45. br i1 %c, label %if.then, label %if.end
  46. if.then: ; preds = %entry
  47. br label %return
  48. if.end: ; preds = %entry
  49. %tmp5 = load i64*, i64** %__a.addr, align 8
  50. br label %return
  51. return: ; preds = %if.end, %if.then
  52. %storemerge = phi i64* [ undef, %if.then ], [ %tmp5, %if.end ]
  53. ret void
  54. }
  55. ; CHECK-LABEL: @no2(
  56. ; CHECK: br i1 %c
  57. define void @no2(i1 %c, i64 %n) nounwind {
  58. entry:
  59. %a = alloca [4 x i64*], align 8
  60. %__a.addr = getelementptr [4 x i64*], [4 x i64*]* %a, i64 1, i64 0
  61. call void @frob(i64** %__a.addr)
  62. br i1 %c, label %if.then, label %if.end
  63. if.then: ; preds = %entry
  64. br label %return
  65. if.end: ; preds = %entry
  66. %tmp5 = load i64*, i64** %__a.addr, align 8
  67. br label %return
  68. return: ; preds = %if.end, %if.then
  69. %storemerge = phi i64* [ undef, %if.then ], [ %tmp5, %if.end ]
  70. ret void
  71. }
  72. declare void @frob(i64** nocapture %p)