optnone-simple.ll 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. ; RUN: opt -O3 -S < %s | FileCheck %s
  2. ; Show 'optnone' suppresses optimizations.
  3. ; Two attribute groups that differ only by 'optnone'.
  4. ; 'optnone' requires 'noinline' so #0 is 'noinline' by itself,
  5. ; even though it would otherwise be irrelevant to this example.
  6. attributes #0 = { noinline }
  7. attributes #1 = { noinline optnone }
  8. ; int iadd(int a, int b){ return a + b; }
  9. define i32 @iadd_optimize(i32 %a, i32 %b) #0 {
  10. entry:
  11. %a.addr = alloca i32, align 4
  12. %b.addr = alloca i32, align 4
  13. store i32 %a, i32* %a.addr, align 4
  14. store i32 %b, i32* %b.addr, align 4
  15. %0 = load i32, i32* %a.addr, align 4
  16. %1 = load i32, i32* %b.addr, align 4
  17. %add = add nsw i32 %0, %1
  18. ret i32 %add
  19. }
  20. ; CHECK-LABEL: @iadd_optimize
  21. ; CHECK-NOT: alloca
  22. ; CHECK-NOT: store
  23. ; CHECK-NOT: load
  24. ; CHECK: ret
  25. define i32 @iadd_optnone(i32 %a, i32 %b) #1 {
  26. entry:
  27. %a.addr = alloca i32, align 4
  28. %b.addr = alloca i32, align 4
  29. store i32 %a, i32* %a.addr, align 4
  30. store i32 %b, i32* %b.addr, align 4
  31. %0 = load i32, i32* %a.addr, align 4
  32. %1 = load i32, i32* %b.addr, align 4
  33. %add = add nsw i32 %0, %1
  34. ret i32 %add
  35. }
  36. ; CHECK-LABEL: @iadd_optnone
  37. ; CHECK: alloca i32
  38. ; CHECK: alloca i32
  39. ; CHECK: store i32
  40. ; CHECK: store i32
  41. ; CHECK: load i32
  42. ; CHECK: load i32
  43. ; CHECK: add nsw i32
  44. ; CHECK: ret i32
  45. ; float fsub(float a, float b){ return a - b; }
  46. define float @fsub_optimize(float %a, float %b) #0 {
  47. entry:
  48. %a.addr = alloca float, align 4
  49. %b.addr = alloca float, align 4
  50. store float %a, float* %a.addr, align 4
  51. store float %b, float* %b.addr, align 4
  52. %0 = load float, float* %a.addr, align 4
  53. %1 = load float, float* %b.addr, align 4
  54. %sub = fsub float %0, %1
  55. ret float %sub
  56. }
  57. ; CHECK-LABEL: @fsub_optimize
  58. ; CHECK-NOT: alloca
  59. ; CHECK-NOT: store
  60. ; CHECK-NOT: load
  61. ; CHECK: ret
  62. define float @fsub_optnone(float %a, float %b) #1 {
  63. entry:
  64. %a.addr = alloca float, align 4
  65. %b.addr = alloca float, align 4
  66. store float %a, float* %a.addr, align 4
  67. store float %b, float* %b.addr, align 4
  68. %0 = load float, float* %a.addr, align 4
  69. %1 = load float, float* %b.addr, align 4
  70. %sub = fsub float %0, %1
  71. ret float %sub
  72. }
  73. ; CHECK-LABEL: @fsub_optnone
  74. ; CHECK: alloca float
  75. ; CHECK: alloca float
  76. ; CHECK: store float
  77. ; CHECK: store float
  78. ; CHECK: load float
  79. ; CHECK: load float
  80. ; CHECK: fsub float
  81. ; CHECK: ret float
  82. ; typedef float __attribute__((ext_vector_type(4))) float4;
  83. ; float4 vmul(float4 a, float4 b){ return a * b; }
  84. define <4 x float> @vmul_optimize(<4 x float> %a, <4 x float> %b) #0 {
  85. entry:
  86. %a.addr = alloca <4 x float>, align 16
  87. %b.addr = alloca <4 x float>, align 16
  88. store <4 x float> %a, <4 x float>* %a.addr, align 16
  89. store <4 x float> %b, <4 x float>* %b.addr, align 16
  90. %0 = load <4 x float>, <4 x float>* %a.addr, align 16
  91. %1 = load <4 x float>, <4 x float>* %b.addr, align 16
  92. %mul = fmul <4 x float> %0, %1
  93. ret <4 x float> %mul
  94. }
  95. ; CHECK-LABEL: @vmul_optimize
  96. ; CHECK-NOT: alloca
  97. ; CHECK-NOT: store
  98. ; CHECK-NOT: load
  99. ; CHECK: ret
  100. define <4 x float> @vmul_optnone(<4 x float> %a, <4 x float> %b) #1 {
  101. entry:
  102. %a.addr = alloca <4 x float>, align 16
  103. %b.addr = alloca <4 x float>, align 16
  104. store <4 x float> %a, <4 x float>* %a.addr, align 16
  105. store <4 x float> %b, <4 x float>* %b.addr, align 16
  106. %0 = load <4 x float>, <4 x float>* %a.addr, align 16
  107. %1 = load <4 x float>, <4 x float>* %b.addr, align 16
  108. %mul = fmul <4 x float> %0, %1
  109. ret <4 x float> %mul
  110. }
  111. ; CHECK-LABEL: @vmul_optnone
  112. ; CHECK: alloca <4 x float>
  113. ; CHECK: alloca <4 x float>
  114. ; CHECK: store <4 x float>
  115. ; CHECK: store <4 x float>
  116. ; CHECK: load <4 x float>
  117. ; CHECK: load <4 x float>
  118. ; CHECK: fmul <4 x float>
  119. ; CHECK: ret