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