promote-order.ll 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. ; RUN: opt -tbaa -basicaa -licm -S < %s | FileCheck %s
  2. ; LICM should keep the stores in their original order when it sinks/promotes them.
  3. ; rdar://12045203
  4. target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
  5. target triple = "x86_64-apple-macosx10.8.0"
  6. @p = external global i8*
  7. define i32* @_Z4doiti(i32 %n, float* %tmp1, i32* %tmp3) nounwind {
  8. entry:
  9. %cmp1 = icmp slt i32 0, %n
  10. br i1 %cmp1, label %for.body.lr.ph, label %for.end
  11. for.body.lr.ph: ; preds = %entry
  12. br label %for.body
  13. for.body: ; preds = %for.body, %for.body.lr.ph
  14. %i.02 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ]
  15. store float 1.000000e+00, float* %tmp1, align 4, !tbaa !1
  16. store i32 1, i32* %tmp3, align 4, !tbaa !2
  17. %inc = add nsw i32 %i.02, 1
  18. %cmp = icmp slt i32 %inc, %n
  19. br i1 %cmp, label %for.body, label %for.cond.for.end_crit_edge
  20. ; CHECK: for.cond.for.end_crit_edge:
  21. ; CHECK: store float 1.000000e+00, float* %tmp1
  22. ; CHECK: store i32 1, i32* %tmp3
  23. for.cond.for.end_crit_edge: ; preds = %for.body
  24. %split = phi i32* [ %tmp3, %for.body ]
  25. br label %for.end
  26. for.end: ; preds = %for.cond.for.end_crit_edge, %entry
  27. %r.0.lcssa = phi i32* [ %split, %for.cond.for.end_crit_edge ], [ undef, %entry ]
  28. ret i32* %r.0.lcssa
  29. }
  30. !0 = !{!"minimal TBAA"}
  31. !1 = !{!3, !3, i64 0}
  32. !2 = !{!4, !4, i64 0}
  33. !3 = !{!"float", !0}
  34. !4 = !{!"int", !0}