new-overflow.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. // RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - | FileCheck %s
  2. // rdar://problem/9246208
  3. // Basic test.
  4. namespace test0 {
  5. struct A {
  6. A();
  7. int x;
  8. };
  9. typedef A elt;
  10. // CHECK: define [[A:%.*]]* @_ZN5test04testEs(i16 signext
  11. // CHECK: [[N:%.*]] = sext i16 {{%.*}} to i32
  12. // CHECK-NEXT: [[T0:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[N]], i32 4)
  13. // CHECK-NEXT: [[T1:%.*]] = extractvalue { i32, i1 } [[T0]], 1
  14. // CHECK-NEXT: [[T2:%.*]] = extractvalue { i32, i1 } [[T0]], 0
  15. // CHECK-NEXT: [[T3:%.*]] = select i1 [[T1]], i32 -1, i32 [[T2]]
  16. // CHECK-NEXT: call i8* @_Znaj(i32 [[T3]])
  17. // CHECK: getelementptr inbounds {{.*}}, i32 [[N]]
  18. elt *test(short s) {
  19. return new elt[s];
  20. }
  21. }
  22. // test0 with a nested array.
  23. namespace test1 {
  24. struct A {
  25. A();
  26. int x;
  27. };
  28. typedef A elt[100];
  29. // CHECK: define [100 x [[A:%.*]]]* @_ZN5test14testEs(i16 signext
  30. // CHECK: [[N:%.*]] = sext i16 {{%.*}} to i32
  31. // CHECK-NEXT: [[T0:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[N]], i32 400)
  32. // CHECK-NEXT: [[T1:%.*]] = extractvalue { i32, i1 } [[T0]], 1
  33. // CHECK-NEXT: [[T2:%.*]] = extractvalue { i32, i1 } [[T0]], 0
  34. // CHECK-NEXT: [[T3:%.*]] = mul i32 [[N]], 100
  35. // CHECK-NEXT: [[T4:%.*]] = select i1 [[T1]], i32 -1, i32 [[T2]]
  36. // CHECK-NEXT: call i8* @_Znaj(i32 [[T4]])
  37. // CHECK: getelementptr inbounds {{.*}}, i32 [[T3]]
  38. elt *test(short s) {
  39. return new elt[s];
  40. }
  41. }
  42. // test1 with an array cookie.
  43. namespace test2 {
  44. struct A {
  45. A();
  46. ~A();
  47. int x;
  48. };
  49. typedef A elt[100];
  50. // CHECK: define [100 x [[A:%.*]]]* @_ZN5test24testEs(i16 signext
  51. // CHECK: [[N:%.*]] = sext i16 {{%.*}} to i32
  52. // CHECK-NEXT: [[T0:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[N]], i32 400)
  53. // CHECK-NEXT: [[T1:%.*]] = extractvalue { i32, i1 } [[T0]], 1
  54. // CHECK-NEXT: [[T2:%.*]] = extractvalue { i32, i1 } [[T0]], 0
  55. // CHECK-NEXT: [[T3:%.*]] = mul i32 [[N]], 100
  56. // CHECK-NEXT: [[T4:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T2]], i32 4)
  57. // CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T4]], 1
  58. // CHECK-NEXT: [[T6:%.*]] = or i1 [[T1]], [[T5]]
  59. // CHECK-NEXT: [[T7:%.*]] = extractvalue { i32, i1 } [[T4]], 0
  60. // CHECK-NEXT: [[T8:%.*]] = select i1 [[T6]], i32 -1, i32 [[T7]]
  61. // CHECK-NEXT: call i8* @_Znaj(i32 [[T8]])
  62. // CHECK: getelementptr inbounds {{.*}}, i32 [[T3]]
  63. elt *test(short s) {
  64. return new elt[s];
  65. }
  66. }
  67. // test0 with a 1-byte element.
  68. namespace test4 {
  69. struct A {
  70. A();
  71. };
  72. typedef A elt;
  73. // CHECK: define [[A:%.*]]* @_ZN5test44testEs(i16 signext
  74. // CHECK: [[N:%.*]] = sext i16 {{%.*}} to i32
  75. // CHECK-NEXT: [[T0:%.*]] = icmp slt i32 [[N]], 0
  76. // CHECK-NEXT: [[T1:%.*]] = select i1 [[T0]], i32 -1, i32 [[N]]
  77. // CHECK-NEXT: call i8* @_Znaj(i32 [[T1]])
  78. // CHECK: getelementptr inbounds {{.*}}, i32 [[N]]
  79. elt *test(short s) {
  80. return new elt[s];
  81. }
  82. }
  83. // test4 with no sext required.
  84. namespace test5 {
  85. struct A {
  86. A();
  87. };
  88. typedef A elt;
  89. // CHECK: define [[A:%.*]]* @_ZN5test54testEi(i32
  90. // CHECK: [[N:%.*]] = load i32, i32*
  91. // CHECK-NEXT: [[T0:%.*]] = icmp slt i32 [[N]], 0
  92. // CHECK-NEXT: [[T1:%.*]] = select i1 [[T0]], i32 -1, i32 [[N]]
  93. // CHECK-NEXT: call i8* @_Znaj(i32 [[T1]])
  94. // CHECK: getelementptr inbounds {{.*}}, i32 [[N]]
  95. elt *test(int s) {
  96. return new elt[s];
  97. }
  98. }
  99. // test0 with an unsigned size.
  100. namespace test6 {
  101. struct A {
  102. A();
  103. int x;
  104. };
  105. typedef A elt;
  106. // CHECK: define [[A:%.*]]* @_ZN5test64testEt(i16 zeroext
  107. // CHECK: [[N:%.*]] = zext i16 {{%.*}} to i32
  108. // CHECK-NEXT: [[T0:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[N]], i32 4)
  109. // CHECK-NEXT: [[T1:%.*]] = extractvalue { i32, i1 } [[T0]], 1
  110. // CHECK-NEXT: [[T2:%.*]] = extractvalue { i32, i1 } [[T0]], 0
  111. // CHECK-NEXT: [[T3:%.*]] = select i1 [[T1]], i32 -1, i32 [[T2]]
  112. // CHECK-NEXT: call i8* @_Znaj(i32 [[T3]])
  113. // CHECK: getelementptr inbounds {{.*}}, i32 [[N]]
  114. elt *test(unsigned short s) {
  115. return new elt[s];
  116. }
  117. }
  118. // test1 with an unsigned size.
  119. namespace test7 {
  120. struct A {
  121. A();
  122. int x;
  123. };
  124. typedef A elt[100];
  125. // CHECK: define [100 x [[A:%.*]]]* @_ZN5test74testEt(i16 zeroext
  126. // CHECK: [[N:%.*]] = zext i16 {{%.*}} to i32
  127. // CHECK-NEXT: [[T0:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[N]], i32 400)
  128. // CHECK-NEXT: [[T1:%.*]] = extractvalue { i32, i1 } [[T0]], 1
  129. // CHECK-NEXT: [[T2:%.*]] = extractvalue { i32, i1 } [[T0]], 0
  130. // CHECK-NEXT: [[T3:%.*]] = mul i32 [[N]], 100
  131. // CHECK-NEXT: [[T4:%.*]] = select i1 [[T1]], i32 -1, i32 [[T2]]
  132. // CHECK-NEXT: call i8* @_Znaj(i32 [[T4]])
  133. // CHECK: getelementptr inbounds {{.*}}, i32 [[T3]]
  134. elt *test(unsigned short s) {
  135. return new elt[s];
  136. }
  137. }
  138. // test0 with a signed type larger than size_t.
  139. namespace test8 {
  140. struct A {
  141. A();
  142. int x;
  143. };
  144. typedef A elt;
  145. // CHECK: define [[A:%.*]]* @_ZN5test84testEx(i64
  146. // CHECK: [[N:%.*]] = load i64, i64*
  147. // CHECK-NEXT: [[T0:%.*]] = icmp uge i64 [[N]], 4294967296
  148. // CHECK-NEXT: [[T1:%.*]] = trunc i64 [[N]] to i32
  149. // CHECK-NEXT: [[T2:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[T1]], i32 4)
  150. // CHECK-NEXT: [[T3:%.*]] = extractvalue { i32, i1 } [[T2]], 1
  151. // CHECK-NEXT: [[T4:%.*]] = or i1 [[T0]], [[T3]]
  152. // CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T2]], 0
  153. // CHECK-NEXT: [[T6:%.*]] = select i1 [[T4]], i32 -1, i32 [[T5]]
  154. // CHECK-NEXT: call i8* @_Znaj(i32 [[T6]])
  155. // CHECK: getelementptr inbounds {{.*}}, i32 [[T1]]
  156. elt *test(long long s) {
  157. return new elt[s];
  158. }
  159. }
  160. // test8 with an unsigned type.
  161. namespace test9 {
  162. struct A {
  163. A();
  164. int x;
  165. };
  166. typedef A elt;
  167. // CHECK: define [[A:%.*]]* @_ZN5test94testEy(i64
  168. // CHECK: [[N:%.*]] = load i64, i64*
  169. // CHECK-NEXT: [[T0:%.*]] = icmp uge i64 [[N]], 4294967296
  170. // CHECK-NEXT: [[T1:%.*]] = trunc i64 [[N]] to i32
  171. // CHECK-NEXT: [[T2:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[T1]], i32 4)
  172. // CHECK-NEXT: [[T3:%.*]] = extractvalue { i32, i1 } [[T2]], 1
  173. // CHECK-NEXT: [[T4:%.*]] = or i1 [[T0]], [[T3]]
  174. // CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T2]], 0
  175. // CHECK-NEXT: [[T6:%.*]] = select i1 [[T4]], i32 -1, i32 [[T5]]
  176. // CHECK-NEXT: call i8* @_Znaj(i32 [[T6]])
  177. // CHECK: getelementptr inbounds {{.*}}, i32 [[T1]]
  178. elt *test(unsigned long long s) {
  179. return new elt[s];
  180. }
  181. }