aligned-qpx.ll 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. ; RUN: opt -S -instcombine < %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-f128:128:128-v128:128:128-n32:64"
  3. target triple = "powerpc64-unknown-linux-gnu"
  4. declare <4 x double> @llvm.ppc.qpx.qvlfs(i8*) #1
  5. define <4 x double> @test1(<4 x float>* %h) #0 {
  6. entry:
  7. %h1 = getelementptr <4 x float>, <4 x float>* %h, i64 1
  8. %hv = bitcast <4 x float>* %h1 to i8*
  9. %vl = call <4 x double> @llvm.ppc.qpx.qvlfs(i8* %hv)
  10. ; CHECK-LABEL: @test1
  11. ; CHECK: @llvm.ppc.qpx.qvlfs
  12. ; CHECK: ret <4 x double>
  13. %v0 = load <4 x float>, <4 x float>* %h, align 8
  14. %v0e = fpext <4 x float> %v0 to <4 x double>
  15. %a = fadd <4 x double> %v0e, %vl
  16. ret <4 x double> %a
  17. }
  18. define <4 x double> @test1a(<4 x float>* align 16 %h) #0 {
  19. entry:
  20. %h1 = getelementptr <4 x float>, <4 x float>* %h, i64 1
  21. %hv = bitcast <4 x float>* %h1 to i8*
  22. %vl = call <4 x double> @llvm.ppc.qpx.qvlfs(i8* %hv)
  23. ; CHECK-LABEL: @test1a
  24. ; CHECK-NOT: @llvm.ppc.qpx.qvlfs
  25. ; CHECK-NOT: load <4 x double>
  26. ; CHECK: ret <4 x double>
  27. %v0 = load <4 x float>, <4 x float>* %h, align 8
  28. %v0e = fpext <4 x float> %v0 to <4 x double>
  29. %a = fadd <4 x double> %v0e, %vl
  30. ret <4 x double> %a
  31. }
  32. declare void @llvm.ppc.qpx.qvstfs(<4 x double>, i8*) #0
  33. define <4 x float> @test2(<4 x float>* %h, <4 x double> %d) #0 {
  34. entry:
  35. %h1 = getelementptr <4 x float>, <4 x float>* %h, i64 1
  36. %hv = bitcast <4 x float>* %h1 to i8*
  37. call void @llvm.ppc.qpx.qvstfs(<4 x double> %d, i8* %hv)
  38. %v0 = load <4 x float>, <4 x float>* %h, align 8
  39. ret <4 x float> %v0
  40. ; CHECK-LABEL: @test2
  41. ; CHECK: @llvm.ppc.qpx.qvstfs
  42. ; CHECK: ret <4 x float>
  43. }
  44. define <4 x float> @test2a(<4 x float>* align 16 %h, <4 x double> %d) #0 {
  45. entry:
  46. %h1 = getelementptr <4 x float>, <4 x float>* %h, i64 1
  47. %hv = bitcast <4 x float>* %h1 to i8*
  48. call void @llvm.ppc.qpx.qvstfs(<4 x double> %d, i8* %hv)
  49. %v0 = load <4 x float>, <4 x float>* %h, align 8
  50. ret <4 x float> %v0
  51. ; CHECK-LABEL: @test2
  52. ; CHECK: fptrunc <4 x double> %d to <4 x float>
  53. ; CHECK-NOT: @llvm.ppc.qpx.qvstfs
  54. ; CHECK-NOT: store <4 x double>
  55. ; CHECK: ret <4 x float>
  56. }
  57. declare <4 x double> @llvm.ppc.qpx.qvlfd(i8*) #1
  58. define <4 x double> @test1l(<4 x double>* %h) #0 {
  59. entry:
  60. %h1 = getelementptr <4 x double>, <4 x double>* %h, i64 1
  61. %hv = bitcast <4 x double>* %h1 to i8*
  62. %vl = call <4 x double> @llvm.ppc.qpx.qvlfd(i8* %hv)
  63. ; CHECK-LABEL: @test1l
  64. ; CHECK: @llvm.ppc.qpx.qvlfd
  65. ; CHECK: ret <4 x double>
  66. %v0 = load <4 x double>, <4 x double>* %h, align 8
  67. %a = fadd <4 x double> %v0, %vl
  68. ret <4 x double> %a
  69. }
  70. define <4 x double> @test1ln(<4 x double>* align 16 %h) #0 {
  71. entry:
  72. %h1 = getelementptr <4 x double>, <4 x double>* %h, i64 1
  73. %hv = bitcast <4 x double>* %h1 to i8*
  74. %vl = call <4 x double> @llvm.ppc.qpx.qvlfd(i8* %hv)
  75. ; CHECK-LABEL: @test1ln
  76. ; CHECK: @llvm.ppc.qpx.qvlfd
  77. ; CHECK: ret <4 x double>
  78. %v0 = load <4 x double>, <4 x double>* %h, align 8
  79. %a = fadd <4 x double> %v0, %vl
  80. ret <4 x double> %a
  81. }
  82. define <4 x double> @test1la(<4 x double>* align 32 %h) #0 {
  83. entry:
  84. %h1 = getelementptr <4 x double>, <4 x double>* %h, i64 1
  85. %hv = bitcast <4 x double>* %h1 to i8*
  86. %vl = call <4 x double> @llvm.ppc.qpx.qvlfd(i8* %hv)
  87. ; CHECK-LABEL: @test1la
  88. ; CHECK-NOT: @llvm.ppc.qpx.qvlfd
  89. ; CHECK: ret <4 x double>
  90. %v0 = load <4 x double>, <4 x double>* %h, align 8
  91. %a = fadd <4 x double> %v0, %vl
  92. ret <4 x double> %a
  93. }
  94. declare void @llvm.ppc.qpx.qvstfd(<4 x double>, i8*) #0
  95. define <4 x double> @test2l(<4 x double>* %h, <4 x double> %d) #0 {
  96. entry:
  97. %h1 = getelementptr <4 x double>, <4 x double>* %h, i64 1
  98. %hv = bitcast <4 x double>* %h1 to i8*
  99. call void @llvm.ppc.qpx.qvstfd(<4 x double> %d, i8* %hv)
  100. %v0 = load <4 x double>, <4 x double>* %h, align 8
  101. ret <4 x double> %v0
  102. ; CHECK-LABEL: @test2l
  103. ; CHECK: @llvm.ppc.qpx.qvstfd
  104. ; CHECK: ret <4 x double>
  105. }
  106. define <4 x double> @test2ln(<4 x double>* align 16 %h, <4 x double> %d) #0 {
  107. entry:
  108. %h1 = getelementptr <4 x double>, <4 x double>* %h, i64 1
  109. %hv = bitcast <4 x double>* %h1 to i8*
  110. call void @llvm.ppc.qpx.qvstfd(<4 x double> %d, i8* %hv)
  111. %v0 = load <4 x double>, <4 x double>* %h, align 8
  112. ret <4 x double> %v0
  113. ; CHECK-LABEL: @test2ln
  114. ; CHECK: @llvm.ppc.qpx.qvstfd
  115. ; CHECK: ret <4 x double>
  116. }
  117. define <4 x double> @test2la(<4 x double>* align 32 %h, <4 x double> %d) #0 {
  118. entry:
  119. %h1 = getelementptr <4 x double>, <4 x double>* %h, i64 1
  120. %hv = bitcast <4 x double>* %h1 to i8*
  121. call void @llvm.ppc.qpx.qvstfd(<4 x double> %d, i8* %hv)
  122. %v0 = load <4 x double>, <4 x double>* %h, align 8
  123. ret <4 x double> %v0
  124. ; CHECK-LABEL: @test2l
  125. ; CHECK-NOT: @llvm.ppc.qpx.qvstfd
  126. ; CHECK: ret <4 x double>
  127. }
  128. attributes #0 = { nounwind }
  129. attributes #1 = { nounwind readonly }