inline_minisize.ll 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. ; RUN: opt -O2 -S < %s | FileCheck %s
  2. @data = common global i32* null, align 8
  3. define i32 @fct1(i32 %a) nounwind uwtable ssp {
  4. entry:
  5. %a.addr = alloca i32, align 4
  6. %res = alloca i32, align 4
  7. %i = alloca i32, align 4
  8. store i32 %a, i32* %a.addr, align 4
  9. %tmp = load i32, i32* %a.addr, align 4
  10. %idxprom = sext i32 %tmp to i64
  11. %tmp1 = load i32*, i32** @data, align 8
  12. %arrayidx = getelementptr inbounds i32, i32* %tmp1, i64 %idxprom
  13. %tmp2 = load i32, i32* %arrayidx, align 4
  14. %tmp3 = load i32, i32* %a.addr, align 4
  15. %add = add nsw i32 %tmp3, 1
  16. %idxprom1 = sext i32 %add to i64
  17. %tmp4 = load i32*, i32** @data, align 8
  18. %arrayidx2 = getelementptr inbounds i32, i32* %tmp4, i64 %idxprom1
  19. %tmp5 = load i32, i32* %arrayidx2, align 4
  20. %mul = mul nsw i32 %tmp2, %tmp5
  21. store i32 %mul, i32* %res, align 4
  22. store i32 0, i32* %i, align 4
  23. store i32 0, i32* %i, align 4
  24. br label %for.cond
  25. for.cond: ; preds = %for.inc, %entry
  26. %tmp6 = load i32, i32* %i, align 4
  27. %tmp7 = load i32, i32* %res, align 4
  28. %cmp = icmp slt i32 %tmp6, %tmp7
  29. br i1 %cmp, label %for.body, label %for.end
  30. for.body: ; preds = %for.cond
  31. %tmp8 = load i32, i32* %i, align 4
  32. %idxprom3 = sext i32 %tmp8 to i64
  33. %tmp9 = load i32*, i32** @data, align 8
  34. %arrayidx4 = getelementptr inbounds i32, i32* %tmp9, i64 %idxprom3
  35. call void @fct0(i32* %arrayidx4)
  36. br label %for.inc
  37. for.inc: ; preds = %for.body
  38. %tmp10 = load i32, i32* %i, align 4
  39. %inc = add nsw i32 %tmp10, 1
  40. store i32 %inc, i32* %i, align 4
  41. br label %for.cond
  42. for.end: ; preds = %for.cond
  43. store i32 0, i32* %i, align 4
  44. br label %for.cond5
  45. for.cond5: ; preds = %for.inc10, %for.end
  46. %tmp11 = load i32, i32* %i, align 4
  47. %tmp12 = load i32, i32* %res, align 4
  48. %cmp6 = icmp slt i32 %tmp11, %tmp12
  49. br i1 %cmp6, label %for.body7, label %for.end12
  50. for.body7: ; preds = %for.cond5
  51. %tmp13 = load i32, i32* %i, align 4
  52. %idxprom8 = sext i32 %tmp13 to i64
  53. %tmp14 = load i32*, i32** @data, align 8
  54. %arrayidx9 = getelementptr inbounds i32, i32* %tmp14, i64 %idxprom8
  55. call void @fct0(i32* %arrayidx9)
  56. br label %for.inc10
  57. for.inc10: ; preds = %for.body7
  58. %tmp15 = load i32, i32* %i, align 4
  59. %inc11 = add nsw i32 %tmp15, 1
  60. store i32 %inc11, i32* %i, align 4
  61. br label %for.cond5
  62. for.end12: ; preds = %for.cond5
  63. store i32 0, i32* %i, align 4
  64. br label %for.cond13
  65. for.cond13: ; preds = %for.inc18, %for.end12
  66. %tmp16 = load i32, i32* %i, align 4
  67. %tmp17 = load i32, i32* %res, align 4
  68. %cmp14 = icmp slt i32 %tmp16, %tmp17
  69. br i1 %cmp14, label %for.body15, label %for.end20
  70. for.body15: ; preds = %for.cond13
  71. %tmp18 = load i32, i32* %i, align 4
  72. %idxprom16 = sext i32 %tmp18 to i64
  73. %tmp19 = load i32*, i32** @data, align 8
  74. %arrayidx17 = getelementptr inbounds i32, i32* %tmp19, i64 %idxprom16
  75. call void @fct0(i32* %arrayidx17)
  76. br label %for.inc18
  77. for.inc18: ; preds = %for.body15
  78. %tmp20 = load i32, i32* %i, align 4
  79. %inc19 = add nsw i32 %tmp20, 1
  80. store i32 %inc19, i32* %i, align 4
  81. br label %for.cond13
  82. for.end20: ; preds = %for.cond13
  83. %tmp21 = load i32, i32* %res, align 4
  84. ret i32 %tmp21
  85. }
  86. declare void @fct0(i32*)
  87. define i32 @fct2(i32 %a) nounwind uwtable inlinehint ssp {
  88. entry:
  89. %a.addr = alloca i32, align 4
  90. %res = alloca i32, align 4
  91. %i = alloca i32, align 4
  92. store i32 %a, i32* %a.addr, align 4
  93. %tmp = load i32, i32* %a.addr, align 4
  94. %shl = shl i32 %tmp, 1
  95. %idxprom = sext i32 %shl to i64
  96. %tmp1 = load i32*, i32** @data, align 8
  97. %arrayidx = getelementptr inbounds i32, i32* %tmp1, i64 %idxprom
  98. %tmp2 = load i32, i32* %arrayidx, align 4
  99. %tmp3 = load i32, i32* %a.addr, align 4
  100. %shl1 = shl i32 %tmp3, 1
  101. %add = add nsw i32 %shl1, 13
  102. %idxprom2 = sext i32 %add to i64
  103. %tmp4 = load i32*, i32** @data, align 8
  104. %arrayidx3 = getelementptr inbounds i32, i32* %tmp4, i64 %idxprom2
  105. %tmp5 = load i32, i32* %arrayidx3, align 4
  106. %mul = mul nsw i32 %tmp2, %tmp5
  107. store i32 %mul, i32* %res, align 4
  108. store i32 0, i32* %i, align 4
  109. store i32 0, i32* %i, align 4
  110. br label %for.cond
  111. for.cond: ; preds = %for.inc, %entry
  112. %tmp6 = load i32, i32* %i, align 4
  113. %tmp7 = load i32, i32* %res, align 4
  114. %cmp = icmp slt i32 %tmp6, %tmp7
  115. br i1 %cmp, label %for.body, label %for.end
  116. for.body: ; preds = %for.cond
  117. %tmp8 = load i32, i32* %i, align 4
  118. %idxprom4 = sext i32 %tmp8 to i64
  119. %tmp9 = load i32*, i32** @data, align 8
  120. %arrayidx5 = getelementptr inbounds i32, i32* %tmp9, i64 %idxprom4
  121. call void @fct0(i32* %arrayidx5)
  122. br label %for.inc
  123. for.inc: ; preds = %for.body
  124. %tmp10 = load i32, i32* %i, align 4
  125. %inc = add nsw i32 %tmp10, 1
  126. store i32 %inc, i32* %i, align 4
  127. br label %for.cond
  128. for.end: ; preds = %for.cond
  129. store i32 0, i32* %i, align 4
  130. br label %for.cond6
  131. for.cond6: ; preds = %for.inc11, %for.end
  132. %tmp11 = load i32, i32* %i, align 4
  133. %tmp12 = load i32, i32* %res, align 4
  134. %cmp7 = icmp slt i32 %tmp11, %tmp12
  135. br i1 %cmp7, label %for.body8, label %for.end13
  136. for.body8: ; preds = %for.cond6
  137. %tmp13 = load i32, i32* %i, align 4
  138. %idxprom9 = sext i32 %tmp13 to i64
  139. %tmp14 = load i32*, i32** @data, align 8
  140. %arrayidx10 = getelementptr inbounds i32, i32* %tmp14, i64 %idxprom9
  141. call void @fct0(i32* %arrayidx10)
  142. br label %for.inc11
  143. for.inc11: ; preds = %for.body8
  144. %tmp15 = load i32, i32* %i, align 4
  145. %inc12 = add nsw i32 %tmp15, 1
  146. store i32 %inc12, i32* %i, align 4
  147. br label %for.cond6
  148. for.end13: ; preds = %for.cond6
  149. store i32 0, i32* %i, align 4
  150. br label %for.cond14
  151. for.cond14: ; preds = %for.inc19, %for.end13
  152. %tmp16 = load i32, i32* %i, align 4
  153. %tmp17 = load i32, i32* %res, align 4
  154. %cmp15 = icmp slt i32 %tmp16, %tmp17
  155. br i1 %cmp15, label %for.body16, label %for.end21
  156. for.body16: ; preds = %for.cond14
  157. %tmp18 = load i32, i32* %i, align 4
  158. %idxprom17 = sext i32 %tmp18 to i64
  159. %tmp19 = load i32*, i32** @data, align 8
  160. %arrayidx18 = getelementptr inbounds i32, i32* %tmp19, i64 %idxprom17
  161. call void @fct0(i32* %arrayidx18)
  162. br label %for.inc19
  163. for.inc19: ; preds = %for.body16
  164. %tmp20 = load i32, i32* %i, align 4
  165. %inc20 = add nsw i32 %tmp20, 1
  166. store i32 %inc20, i32* %i, align 4
  167. br label %for.cond14
  168. for.end21: ; preds = %for.cond14
  169. %tmp21 = load i32, i32* %res, align 4
  170. ret i32 %tmp21
  171. }
  172. define i32 @fct3(i32 %c) nounwind uwtable ssp {
  173. entry:
  174. ;CHECK-LABEL: @fct3(
  175. ;CHECK: call i32 @fct1
  176. ; The inline keyword gives a sufficient benefits to inline fct2
  177. ;CHECK-NOT: call i32 @fct2
  178. %c.addr = alloca i32, align 4
  179. store i32 %c, i32* %c.addr, align 4
  180. %tmp = load i32, i32* %c.addr, align 4
  181. %call = call i32 @fct1(i32 %tmp)
  182. %tmp1 = load i32, i32* %c.addr, align 4
  183. %call1 = call i32 @fct2(i32 %tmp1)
  184. %add = add nsw i32 %call, %call1
  185. ret i32 %add
  186. }
  187. define i32 @fct4(i32 %c) minsize nounwind uwtable ssp {
  188. entry:
  189. ;CHECK-LABEL: @fct4(
  190. ;CHECK: call i32 @fct1
  191. ; With Oz (minsize attribute), the benefit of inlining fct2
  192. ; is the same as fct1, thus no inlining for fct2
  193. ;CHECK: call i32 @fct2
  194. %c.addr = alloca i32, align 4
  195. store i32 %c, i32* %c.addr, align 4
  196. %tmp = load i32, i32* %c.addr, align 4
  197. %call = call i32 @fct1(i32 %tmp)
  198. %tmp1 = load i32, i32* %c.addr, align 4
  199. %call1 = call i32 @fct2(i32 %tmp1)
  200. %add = add nsw i32 %call, %call1
  201. ret i32 %add
  202. }