unpack-fca.ll 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. ; RUN: opt -instcombine -S < %s | FileCheck %s
  2. target datalayout = "e-i64:64-f80:128-n8:16:32:64"
  3. target triple = "x86_64-unknown-linux-gnu"
  4. %A__vtbl = type { i8*, i32 (%A*)* }
  5. %A = type { %A__vtbl* }
  6. @A__vtblZ = constant %A__vtbl { i8* null, i32 (%A*)* @A.foo }
  7. declare i32 @A.foo(%A* nocapture %this)
  8. declare i8* @allocmemory(i64)
  9. define void @storeA() {
  10. body:
  11. %0 = tail call i8* @allocmemory(i64 32)
  12. %1 = bitcast i8* %0 to %A*
  13. ; CHECK-LABEL: storeA
  14. ; CHECK: store %A__vtbl* @A__vtblZ
  15. store %A { %A__vtbl* @A__vtblZ }, %A* %1, align 8
  16. ret void
  17. }
  18. define void @storeStructOfA() {
  19. body:
  20. %0 = tail call i8* @allocmemory(i64 32)
  21. %1 = bitcast i8* %0 to { %A }*
  22. ; CHECK-LABEL: storeStructOfA
  23. ; CHECK: store %A__vtbl* @A__vtblZ
  24. store { %A } { %A { %A__vtbl* @A__vtblZ } }, { %A }* %1, align 8
  25. ret void
  26. }
  27. define void @storeArrayOfA() {
  28. body:
  29. %0 = tail call i8* @allocmemory(i64 32)
  30. %1 = bitcast i8* %0 to [1 x %A]*
  31. ; CHECK-LABEL: storeArrayOfA
  32. ; CHECK: store %A__vtbl* @A__vtblZ
  33. store [1 x %A] [%A { %A__vtbl* @A__vtblZ }], [1 x %A]* %1, align 8
  34. ret void
  35. }
  36. define void @storeStructOfArrayOfA() {
  37. body:
  38. %0 = tail call i8* @allocmemory(i64 32)
  39. %1 = bitcast i8* %0 to { [1 x %A] }*
  40. ; CHECK-LABEL: storeStructOfArrayOfA
  41. ; CHECK: store %A__vtbl* @A__vtblZ
  42. store { [1 x %A] } { [1 x %A] [%A { %A__vtbl* @A__vtblZ }] }, { [1 x %A] }* %1, align 8
  43. ret void
  44. }
  45. define %A @loadA() {
  46. body:
  47. %0 = tail call i8* @allocmemory(i64 32)
  48. %1 = bitcast i8* %0 to %A*
  49. ; CHECK-LABEL: loadA
  50. ; CHECK: load %A__vtbl*,
  51. ; CHECK: insertvalue %A undef, %A__vtbl* {{.*}}, 0
  52. %2 = load %A, %A* %1, align 8
  53. ret %A %2
  54. }
  55. define { %A } @loadStructOfA() {
  56. body:
  57. %0 = tail call i8* @allocmemory(i64 32)
  58. %1 = bitcast i8* %0 to { %A }*
  59. ; CHECK-LABEL: loadStructOfA
  60. ; CHECK: load %A__vtbl*,
  61. ; CHECK: insertvalue %A undef, %A__vtbl* {{.*}}, 0
  62. ; CHECK: insertvalue { %A } undef, %A {{.*}}, 0
  63. %2 = load { %A }, { %A }* %1, align 8
  64. ret { %A } %2
  65. }
  66. define [1 x %A] @loadArrayOfA() {
  67. body:
  68. %0 = tail call i8* @allocmemory(i64 32)
  69. %1 = bitcast i8* %0 to [1 x %A]*
  70. ; CHECK-LABEL: loadArrayOfA
  71. ; CHECK: load %A__vtbl*,
  72. ; CHECK: insertvalue %A undef, %A__vtbl* {{.*}}, 0
  73. ; CHECK: insertvalue [1 x %A] undef, %A {{.*}}, 0
  74. %2 = load [1 x %A], [1 x %A]* %1, align 8
  75. ret [1 x %A] %2
  76. }
  77. define { [1 x %A] } @loadStructOfArrayOfA() {
  78. body:
  79. %0 = tail call i8* @allocmemory(i64 32)
  80. %1 = bitcast i8* %0 to { [1 x %A] }*
  81. ; CHECK-LABEL: loadStructOfArrayOfA
  82. ; CHECK: load %A__vtbl*,
  83. ; CHECK: insertvalue %A undef, %A__vtbl* {{.*}}, 0
  84. ; CHECK: insertvalue [1 x %A] undef, %A {{.*}}, 0
  85. ; CHECK: insertvalue { [1 x %A] } undef, [1 x %A] {{.*}}, 0
  86. %2 = load { [1 x %A] }, { [1 x %A] }* %1, align 8
  87. ret { [1 x %A] } %2
  88. }
  89. define { %A } @structOfA() {
  90. body:
  91. %0 = tail call i8* @allocmemory(i64 32)
  92. %1 = bitcast i8* %0 to { %A }*
  93. ; CHECK-LABEL: structOfA
  94. ; CHECK: store %A__vtbl* @A__vtblZ
  95. store { %A } { %A { %A__vtbl* @A__vtblZ } }, { %A }* %1, align 8
  96. %2 = load { %A }, { %A }* %1, align 8
  97. ; CHECK-NOT: load
  98. ; CHECK: ret { %A } { %A { %A__vtbl* @A__vtblZ } }
  99. ret { %A } %2
  100. }