lifetime.ll 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. ; RUN: opt -S -loop-vectorize -force-vector-width=2 -force-vector-interleave=1 < %s | FileCheck %s
  2. 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"
  3. ; Make sure we can vectorize loops which contain lifetime markers.
  4. ; CHECK-LABEL: @test(
  5. ; CHECK: call void @llvm.lifetime.end
  6. ; CHECK: store <2 x i32>
  7. ; CHECK: call void @llvm.lifetime.start
  8. define void @test(i32 *%d) {
  9. entry:
  10. %arr = alloca [1024 x i32], align 16
  11. %0 = bitcast [1024 x i32]* %arr to i8*
  12. call void @llvm.lifetime.start(i64 4096, i8* %0) #1
  13. br label %for.body
  14. for.body:
  15. %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
  16. call void @llvm.lifetime.end(i64 4096, i8* %0) #1
  17. %arrayidx = getelementptr inbounds i32, i32* %d, i64 %indvars.iv
  18. %1 = load i32, i32* %arrayidx, align 8
  19. store i32 100, i32* %arrayidx, align 8
  20. call void @llvm.lifetime.start(i64 4096, i8* %0) #1
  21. %indvars.iv.next = add i64 %indvars.iv, 1
  22. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  23. %exitcond = icmp ne i32 %lftr.wideiv, 128
  24. br i1 %exitcond, label %for.body, label %for.end
  25. for.end:
  26. call void @llvm.lifetime.end(i64 4096, i8* %0) #1
  27. ret void
  28. }
  29. ; CHECK-LABEL: @testbitcast(
  30. ; CHECK: call void @llvm.lifetime.end
  31. ; CHECK: store <2 x i32>
  32. ; CHECK: call void @llvm.lifetime.start
  33. define void @testbitcast(i32 *%d) {
  34. entry:
  35. %arr = alloca [1024 x i32], align 16
  36. %0 = bitcast [1024 x i32]* %arr to i8*
  37. call void @llvm.lifetime.start(i64 4096, i8* %0) #1
  38. br label %for.body
  39. for.body:
  40. %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
  41. %1 = bitcast [1024 x i32]* %arr to i8*
  42. call void @llvm.lifetime.end(i64 4096, i8* %1) #1
  43. %arrayidx = getelementptr inbounds i32, i32* %d, i64 %indvars.iv
  44. %2 = load i32, i32* %arrayidx, align 8
  45. store i32 100, i32* %arrayidx, align 8
  46. call void @llvm.lifetime.start(i64 4096, i8* %1) #1
  47. %indvars.iv.next = add i64 %indvars.iv, 1
  48. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  49. %exitcond = icmp ne i32 %lftr.wideiv, 128
  50. br i1 %exitcond, label %for.body, label %for.end
  51. for.end:
  52. call void @llvm.lifetime.end(i64 4096, i8* %0) #1
  53. ret void
  54. }
  55. ; CHECK-LABEL: @testloopvariant(
  56. ; CHECK: call void @llvm.lifetime.end
  57. ; CHECK: store <2 x i32>
  58. ; CHECK: call void @llvm.lifetime.start
  59. define void @testloopvariant(i32 *%d) {
  60. entry:
  61. %arr = alloca [1024 x i32], align 16
  62. br label %for.body
  63. for.body:
  64. %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
  65. %0 = getelementptr [1024 x i32], [1024 x i32]* %arr, i32 0, i64 %indvars.iv
  66. %1 = bitcast [1024 x i32]* %arr to i8*
  67. call void @llvm.lifetime.end(i64 4096, i8* %1) #1
  68. %arrayidx = getelementptr inbounds i32, i32* %d, i64 %indvars.iv
  69. %2 = load i32, i32* %arrayidx, align 8
  70. store i32 100, i32* %arrayidx, align 8
  71. call void @llvm.lifetime.start(i64 4096, i8* %1) #1
  72. %indvars.iv.next = add i64 %indvars.iv, 1
  73. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  74. %exitcond = icmp ne i32 %lftr.wideiv, 128
  75. br i1 %exitcond, label %for.body, label %for.end
  76. for.end:
  77. ret void
  78. }
  79. declare void @llvm.lifetime.start(i64, i8* nocapture) #1
  80. declare void @llvm.lifetime.end(i64, i8* nocapture) #1