select-extractelement.ll 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. ; RUN: opt -S -instcombine < %s | FileCheck %s
  2. declare void @v4float_user(<4 x float>) #0
  3. define float @extract_one_select(<4 x float> %a, <4 x float> %b, i32 %c) #0 {
  4. ; CHECK-LABEL: @extract_one_select(
  5. ; CHECK-NOT: select i1 {{.*}}, <4 x float>
  6. %cmp = icmp ne i32 %c, 0
  7. %sel = select i1 %cmp, <4 x float> %a, <4 x float> %b
  8. %extract = extractelement <4 x float> %sel, i32 2
  9. ret float %extract
  10. }
  11. ; Multiple extractelements
  12. define <2 x float> @extract_two_select(<4 x float> %a, <4 x float> %b, i32 %c) #0 {
  13. ; CHECK-LABEL: @extract_two_select(
  14. ; CHECK: select i1 {{.*}}, <4 x float>
  15. %cmp = icmp ne i32 %c, 0
  16. %sel = select i1 %cmp, <4 x float> %a, <4 x float> %b
  17. %extract1 = extractelement <4 x float> %sel, i32 1
  18. %extract2 = extractelement <4 x float> %sel, i32 2
  19. %build1 = insertelement <2 x float> undef, float %extract1, i32 0
  20. %build2 = insertelement <2 x float> %build1, float %extract2, i32 1
  21. ret <2 x float> %build2
  22. }
  23. ; Select has an extra non-extractelement user, don't change it
  24. define float @extract_one_select_user(<4 x float> %a, <4 x float> %b, i32 %c) #0 {
  25. ; CHECK-LABEL: @extract_one_select_user(
  26. ; CHECK: select i1 {{.*}}, <4 x float>
  27. %cmp = icmp ne i32 %c, 0
  28. %sel = select i1 %cmp, <4 x float> %a, <4 x float> %b
  29. %extract = extractelement <4 x float> %sel, i32 2
  30. call void @v4float_user(<4 x float> %sel)
  31. ret float %extract
  32. }
  33. define float @extract_one_vselect_user(<4 x float> %a, <4 x float> %b, <4 x i32> %c) #0 {
  34. ; CHECK-LABEL: @extract_one_vselect_user(
  35. ; CHECK: select <4 x i1> {{.*}}, <4 x float>
  36. %cmp = icmp ne <4 x i32> %c, zeroinitializer
  37. %sel = select <4 x i1> %cmp, <4 x float> %a, <4 x float> %b
  38. %extract = extractelement <4 x float> %sel, i32 2
  39. call void @v4float_user(<4 x float> %sel)
  40. ret float %extract
  41. }
  42. ; Extract from a vector select
  43. define float @extract_one_vselect(<4 x float> %a, <4 x float> %b, <4 x i32> %c) #0 {
  44. ; CHECK-LABEL: @extract_one_vselect(
  45. ; CHECK-NOT: select <4 x i1>
  46. %cmp = icmp ne <4 x i32> %c, zeroinitializer
  47. %select = select <4 x i1> %cmp, <4 x float> %a, <4 x float> %b
  48. %extract = extractelement <4 x float> %select, i32 0
  49. ret float %extract
  50. }
  51. ; Multiple extractelements from a vector select
  52. define <2 x float> @extract_two_vselect(<4 x float> %a, <4 x float> %b, <4 x i32> %c) #0 {
  53. ; CHECK-LABEL: @extract_two_vselect(
  54. ; CHECK-NOT: select i1 {{.*}}, <4 x float>
  55. %cmp = icmp ne <4 x i32> %c, zeroinitializer
  56. %sel = select <4 x i1> %cmp, <4 x float> %a, <4 x float> %b
  57. %extract1 = extractelement <4 x float> %sel, i32 1
  58. %extract2 = extractelement <4 x float> %sel, i32 2
  59. %build1 = insertelement <2 x float> undef, float %extract1, i32 0
  60. %build2 = insertelement <2 x float> %build1, float %extract2, i32 1
  61. ret <2 x float> %build2
  62. }
  63. ; All the vector selects should be decomposed into scalar selects
  64. ; Test multiple extractelements
  65. define <4 x float> @simple_vector_select(<4 x float> %a, <4 x float> %b, <4 x i32> %c) #0 {
  66. ; CHECK-LABEL: @simple_vector_select(
  67. ; CHECK-NOT: select i1 {{.*}}, <4 x float>
  68. entry:
  69. %0 = extractelement <4 x i32> %c, i32 0
  70. %tobool = icmp ne i32 %0, 0
  71. %a.sink = select i1 %tobool, <4 x float> %a, <4 x float> %b
  72. %1 = extractelement <4 x float> %a.sink, i32 0
  73. %2 = insertelement <4 x float> undef, float %1, i32 0
  74. %3 = extractelement <4 x i32> %c, i32 1
  75. %tobool1 = icmp ne i32 %3, 0
  76. %a.sink1 = select i1 %tobool1, <4 x float> %a, <4 x float> %b
  77. %4 = extractelement <4 x float> %a.sink1, i32 1
  78. %5 = insertelement <4 x float> %2, float %4, i32 1
  79. %6 = extractelement <4 x i32> %c, i32 2
  80. %tobool6 = icmp ne i32 %6, 0
  81. %a.sink2 = select i1 %tobool6, <4 x float> %a, <4 x float> %b
  82. %7 = extractelement <4 x float> %a.sink2, i32 2
  83. %8 = insertelement <4 x float> %5, float %7, i32 2
  84. %9 = extractelement <4 x i32> %c, i32 3
  85. %tobool11 = icmp ne i32 %9, 0
  86. %a.sink3 = select i1 %tobool11, <4 x float> %a, <4 x float> %b
  87. %10 = extractelement <4 x float> %a.sink3, i32 3
  88. %11 = insertelement <4 x float> %8, float %10, i32 3
  89. ret <4 x float> %11
  90. }
  91. attributes #0 = { nounwind ssp uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }