gcd_multiply_expr.ll 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. ; RUN: opt < %s -basicaa -da -analyze -delinearize
  2. ;
  3. ; a, b, c, d, g, h;
  4. ; char *f;
  5. ; static fn1(p1) {
  6. ; char *e = p1;
  7. ; for (; d;) {
  8. ; a = 0;
  9. ; for (;; ++a)
  10. ; for (; b; ++b)
  11. ; c = e[b + a];
  12. ; }
  13. ; }
  14. ;
  15. ; fn2() {
  16. ; for (;;)
  17. ; fn1(&f[g * h]);
  18. ; }
  19. @g = common global i32 0, align 4
  20. @h = common global i32 0, align 4
  21. @f = common global i8* null, align 4
  22. @a = common global i32 0, align 4
  23. @b = common global i32 0, align 4
  24. @c = common global i32 0, align 4
  25. @d = common global i32 0, align 4
  26. define i32 @fn2() {
  27. entry:
  28. %.pr = load i32, i32* @d, align 4
  29. %phitmp = icmp eq i32 %.pr, 0
  30. br label %for.cond
  31. for.cond:
  32. %0 = phi i1 [ true, %for.cond ], [ %phitmp, %entry ]
  33. br i1 %0, label %for.cond, label %for.cond2thread-pre-split.preheader.i
  34. for.cond2thread-pre-split.preheader.i:
  35. %1 = load i32, i32* @g, align 4
  36. %2 = load i32, i32* @h, align 4
  37. %mul = mul nsw i32 %2, %1
  38. %3 = load i8*, i8** @f, align 4
  39. %.pr.pre.i = load i32, i32* @b, align 4
  40. br label %for.cond2thread-pre-split.i
  41. for.cond2thread-pre-split.i:
  42. %.pr.i = phi i32 [ 0, %for.inc5.i ], [ %.pr.pre.i, %for.cond2thread-pre-split.preheader.i ]
  43. %storemerge.i = phi i32 [ %inc6.i, %for.inc5.i ], [ 0, %for.cond2thread-pre-split.preheader.i ]
  44. store i32 %storemerge.i, i32* @a, align 4
  45. %tobool31.i = icmp eq i32 %.pr.i, 0
  46. br i1 %tobool31.i, label %for.inc5.i, label %for.body4.preheader.i
  47. for.body4.preheader.i:
  48. %4 = icmp slt i32 %.pr.i, -7
  49. %add.i = add i32 %storemerge.i, %mul
  50. br i1 %4, label %for.body4.i.preheader, label %for.body4.ur.i.preheader
  51. for.body4.i.preheader:
  52. %5 = sub i32 -8, %.pr.i
  53. %6 = lshr i32 %5, 3
  54. %7 = mul i32 %6, 8
  55. br label %for.body4.i
  56. for.body4.i:
  57. %8 = phi i32 [ %inc.7.i, %for.body4.i ], [ %.pr.i, %for.body4.i.preheader ]
  58. %arrayidx.sum1 = add i32 %add.i, %8
  59. %arrayidx.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum1
  60. %9 = load i8, i8* %arrayidx.i, align 1
  61. %conv.i = sext i8 %9 to i32
  62. store i32 %conv.i, i32* @c, align 4
  63. %inc.i = add nsw i32 %8, 1
  64. store i32 %inc.i, i32* @b, align 4
  65. %arrayidx.sum2 = add i32 %add.i, %inc.i
  66. %arrayidx.1.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum2
  67. %10 = load i8, i8* %arrayidx.1.i, align 1
  68. %conv.1.i = sext i8 %10 to i32
  69. store i32 %conv.1.i, i32* @c, align 4
  70. %inc.1.i = add nsw i32 %8, 2
  71. store i32 %inc.1.i, i32* @b, align 4
  72. %arrayidx.sum3 = add i32 %add.i, %inc.1.i
  73. %arrayidx.2.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum3
  74. %11 = load i8, i8* %arrayidx.2.i, align 1
  75. %conv.2.i = sext i8 %11 to i32
  76. store i32 %conv.2.i, i32* @c, align 4
  77. %inc.2.i = add nsw i32 %8, 3
  78. store i32 %inc.2.i, i32* @b, align 4
  79. %arrayidx.sum4 = add i32 %add.i, %inc.2.i
  80. %arrayidx.3.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum4
  81. %12 = load i8, i8* %arrayidx.3.i, align 1
  82. %conv.3.i = sext i8 %12 to i32
  83. store i32 %conv.3.i, i32* @c, align 4
  84. %inc.3.i = add nsw i32 %8, 4
  85. store i32 %inc.3.i, i32* @b, align 4
  86. %arrayidx.sum5 = add i32 %add.i, %inc.3.i
  87. %arrayidx.4.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum5
  88. %13 = load i8, i8* %arrayidx.4.i, align 1
  89. %conv.4.i = sext i8 %13 to i32
  90. store i32 %conv.4.i, i32* @c, align 4
  91. %inc.4.i = add nsw i32 %8, 5
  92. store i32 %inc.4.i, i32* @b, align 4
  93. %arrayidx.sum6 = add i32 %add.i, %inc.4.i
  94. %arrayidx.5.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum6
  95. %14 = load i8, i8* %arrayidx.5.i, align 1
  96. %conv.5.i = sext i8 %14 to i32
  97. store i32 %conv.5.i, i32* @c, align 4
  98. %inc.5.i = add nsw i32 %8, 6
  99. store i32 %inc.5.i, i32* @b, align 4
  100. %arrayidx.sum7 = add i32 %add.i, %inc.5.i
  101. %arrayidx.6.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum7
  102. %15 = load i8, i8* %arrayidx.6.i, align 1
  103. %conv.6.i = sext i8 %15 to i32
  104. store i32 %conv.6.i, i32* @c, align 4
  105. %inc.6.i = add nsw i32 %8, 7
  106. store i32 %inc.6.i, i32* @b, align 4
  107. %arrayidx.sum8 = add i32 %add.i, %inc.6.i
  108. %arrayidx.7.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum8
  109. %16 = load i8, i8* %arrayidx.7.i, align 1
  110. %conv.7.i = sext i8 %16 to i32
  111. store i32 %conv.7.i, i32* @c, align 4
  112. %inc.7.i = add nsw i32 %8, 8
  113. store i32 %inc.7.i, i32* @b, align 4
  114. %tobool3.7.i = icmp sgt i32 %inc.7.i, -8
  115. br i1 %tobool3.7.i, label %for.inc5.loopexit.ur-lcssa.i, label %for.body4.i
  116. for.inc5.loopexit.ur-lcssa.i:
  117. %17 = add i32 %.pr.i, 8
  118. %18 = add i32 %17, %7
  119. %19 = icmp eq i32 %18, 0
  120. br i1 %19, label %for.inc5.i, label %for.body4.ur.i.preheader
  121. for.body4.ur.i.preheader:
  122. %.ph = phi i32 [ %18, %for.inc5.loopexit.ur-lcssa.i ], [ %.pr.i, %for.body4.preheader.i ]
  123. br label %for.body4.ur.i
  124. for.body4.ur.i:
  125. %20 = phi i32 [ %inc.ur.i, %for.body4.ur.i ], [ %.ph, %for.body4.ur.i.preheader ]
  126. %arrayidx.sum = add i32 %add.i, %20
  127. %arrayidx.ur.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum
  128. %21 = load i8, i8* %arrayidx.ur.i, align 1
  129. %conv.ur.i = sext i8 %21 to i32
  130. store i32 %conv.ur.i, i32* @c, align 4
  131. %inc.ur.i = add nsw i32 %20, 1
  132. store i32 %inc.ur.i, i32* @b, align 4
  133. %tobool3.ur.i = icmp eq i32 %inc.ur.i, 0
  134. br i1 %tobool3.ur.i, label %for.inc5.i.loopexit, label %for.body4.ur.i
  135. for.inc5.i.loopexit:
  136. br label %for.inc5.i
  137. for.inc5.i:
  138. %inc6.i = add nsw i32 %storemerge.i, 1
  139. br label %for.cond2thread-pre-split.i
  140. }