xref: /aosp_15_r20/external/clang/test/CodeGenCXX/temp-order.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // Output file should have no calls to error() with folding.
2*67e74705SXin Li // RUN: %clang_cc1 -triple i386-unknown-unknown -mllvm -inline-threshold=1024 -O3 -emit-llvm -o %t %s
3*67e74705SXin Li // RUN: FileCheck %s < %t
4*67e74705SXin Li 
pow(unsigned Base,unsigned Power)5*67e74705SXin Li static unsigned pow(unsigned Base, unsigned Power) {
6*67e74705SXin Li   unsigned Val = 1;
7*67e74705SXin Li   while (Power--)
8*67e74705SXin Li     Val *= Base;
9*67e74705SXin Li   return Val;
10*67e74705SXin Li }
11*67e74705SXin Li 
12*67e74705SXin Li struct TempTracker {
13*67e74705SXin Li   unsigned Product, Index;
14*67e74705SXin Li 
TempTrackerTempTracker15*67e74705SXin Li   TempTracker() : Product(1), Index(0) {}
16*67e74705SXin Li 
17*67e74705SXin Li };
18*67e74705SXin Li 
19*67e74705SXin Li // FIXME: This can be used to check elision as well, if P = 0 hacks are removed.
20*67e74705SXin Li struct A {
21*67e74705SXin Li   TempTracker &TT;
22*67e74705SXin Li   mutable unsigned P;
23*67e74705SXin Li   bool Truth;
24*67e74705SXin Li 
AA25*67e74705SXin Li   A(TempTracker &_TT, unsigned _P, bool _Truth = true)
26*67e74705SXin Li     : TT(_TT), P(_P), Truth(_Truth) {}
AA27*67e74705SXin Li   A(const A &RHS) : TT(RHS.TT), P(RHS.P), Truth(RHS.Truth) { RHS.P = 0; }
~AA28*67e74705SXin Li   ~A() {
29*67e74705SXin Li     if (P)
30*67e74705SXin Li       TT.Product *= pow(P, ++TT.Index);
31*67e74705SXin Li   }
32*67e74705SXin Li 
operator =A33*67e74705SXin Li   A &operator=(const A &RHS) {
34*67e74705SXin Li     TT = RHS.TT;
35*67e74705SXin Li     P = RHS.P;
36*67e74705SXin Li     Truth = RHS.Truth;
37*67e74705SXin Li     RHS.P = 0;
38*67e74705SXin Li     return *this;
39*67e74705SXin Li   }
40*67e74705SXin Li 
operator boolA41*67e74705SXin Li   operator bool () { return Truth; }
42*67e74705SXin Li };
43*67e74705SXin Li 
44*67e74705SXin Li // 3, 7, 2
f0(bool val=false)45*67e74705SXin Li static unsigned f0(bool val = false) {
46*67e74705SXin Li   TempTracker tt;
47*67e74705SXin Li   {
48*67e74705SXin Li     A a(tt, 2);
49*67e74705SXin Li     if ((A(tt, 3), val))
50*67e74705SXin Li       A b(tt, 5);
51*67e74705SXin Li     A c(tt, 7);
52*67e74705SXin Li   }
53*67e74705SXin Li   return tt.Product;
54*67e74705SXin Li }
55*67e74705SXin Li 
56*67e74705SXin Li // 3, 5, 7, 2
f1(bool val=true)57*67e74705SXin Li static unsigned f1(bool val = true) {
58*67e74705SXin Li   TempTracker tt;
59*67e74705SXin Li   {
60*67e74705SXin Li     A a(tt, 2);
61*67e74705SXin Li     if ((A(tt, 3), val))
62*67e74705SXin Li       A b(tt, 5);
63*67e74705SXin Li     A c(tt, 7);
64*67e74705SXin Li   }
65*67e74705SXin Li   return tt.Product;
66*67e74705SXin Li }
67*67e74705SXin Li 
68*67e74705SXin Li // 5, 3, 7, 2
f2()69*67e74705SXin Li static unsigned f2() {
70*67e74705SXin Li   TempTracker tt;
71*67e74705SXin Li   {
72*67e74705SXin Li     A a(tt, 2);
73*67e74705SXin Li     if (A b = A(tt, 3))
74*67e74705SXin Li       A c(tt, 5);
75*67e74705SXin Li     A d(tt, 7);
76*67e74705SXin Li   }
77*67e74705SXin Li   return tt.Product;
78*67e74705SXin Li }
79*67e74705SXin Li 
80*67e74705SXin Li // 7, 3, 11, 2
f3()81*67e74705SXin Li static unsigned f3() {
82*67e74705SXin Li   TempTracker tt;
83*67e74705SXin Li   {
84*67e74705SXin Li     A a(tt, 2);
85*67e74705SXin Li     if (A b = A(tt, 3, false))
86*67e74705SXin Li       A c(tt, 5);
87*67e74705SXin Li     else
88*67e74705SXin Li       A c(tt, 7);
89*67e74705SXin Li     A d(tt, 11);
90*67e74705SXin Li   }
91*67e74705SXin Li   return tt.Product;
92*67e74705SXin Li }
93*67e74705SXin Li 
94*67e74705SXin Li // 3, 7, 2
f4()95*67e74705SXin Li static unsigned f4() {
96*67e74705SXin Li   TempTracker tt;
97*67e74705SXin Li   {
98*67e74705SXin Li     A a(tt, 2);
99*67e74705SXin Li     while (A b = A(tt, 3, false))
100*67e74705SXin Li       A c(tt, 5);
101*67e74705SXin Li     A c(tt, 7);
102*67e74705SXin Li   }
103*67e74705SXin Li   return tt.Product;
104*67e74705SXin Li }
105*67e74705SXin Li 
106*67e74705SXin Li // 5, 3, 7, 2
f5()107*67e74705SXin Li static unsigned f5() {
108*67e74705SXin Li   TempTracker tt;
109*67e74705SXin Li   {
110*67e74705SXin Li     A a(tt, 2);
111*67e74705SXin Li     while (A b = A(tt, 3, true)) {
112*67e74705SXin Li       A c(tt, 5);
113*67e74705SXin Li       break;
114*67e74705SXin Li     }
115*67e74705SXin Li     A c(tt, 7);
116*67e74705SXin Li   }
117*67e74705SXin Li   return tt.Product;
118*67e74705SXin Li }
119*67e74705SXin Li 
120*67e74705SXin Li // 3, 7, 11, 5, 13, 2
f6()121*67e74705SXin Li static unsigned f6() {
122*67e74705SXin Li   TempTracker tt;
123*67e74705SXin Li   {
124*67e74705SXin Li     A a(tt, 2);
125*67e74705SXin Li     for (A b = (A(tt, 3), A(tt, 5)), c = (A(tt, 7), A(tt, 11));;)
126*67e74705SXin Li       break;
127*67e74705SXin Li     A c(tt, 13);
128*67e74705SXin Li   }
129*67e74705SXin Li   return tt.Product;
130*67e74705SXin Li }
131*67e74705SXin Li 
132*67e74705SXin Li // 5, 2
f7()133*67e74705SXin Li static unsigned f7() {
134*67e74705SXin Li   TempTracker tt;
135*67e74705SXin Li   {
136*67e74705SXin Li     (void)((A(tt, 2, false) && A(tt, 3, false)) || A(tt, 5, false));
137*67e74705SXin Li   }
138*67e74705SXin Li   return tt.Product;
139*67e74705SXin Li }
140*67e74705SXin Li 
141*67e74705SXin Li // 5, 2
f8()142*67e74705SXin Li static unsigned f8() {
143*67e74705SXin Li   TempTracker tt;
144*67e74705SXin Li 
145*67e74705SXin Li   {
146*67e74705SXin Li     (void)((A(tt, 2) || A(tt, 3)) && A(tt, 5));
147*67e74705SXin Li   }
148*67e74705SXin Li   return tt.Product;
149*67e74705SXin Li }
150*67e74705SXin Li 
151*67e74705SXin Li extern "C" void error();
152*67e74705SXin Li extern "C" void print(const char *Name, unsigned N);
153*67e74705SXin Li 
154*67e74705SXin Li #define ORDER2(a, b) (pow(a, 1) * pow(b, 2))
155*67e74705SXin Li #define ORDER3(a, b, c) (ORDER2(a, b) * pow(c, 3))
156*67e74705SXin Li #define ORDER4(a, b, c, d) (ORDER3(a, b, c) * pow(d, 4))
157*67e74705SXin Li #define ORDER5(a, b, c, d, e) (ORDER4(a, b, c, d) * pow(e, 5))
158*67e74705SXin Li #define ORDER6(a, b, c, d, e, f) (ORDER5(a, b, c, d, e) * pow(f, 6))
test()159*67e74705SXin Li void test() {
160*67e74705SXin Li // CHECK: call void @print(i8* {{.*}}, i32 1176)
161*67e74705SXin Li   print("f0", f0());
162*67e74705SXin Li   if (f0() != ORDER3(3, 7, 2))
163*67e74705SXin Li     error();
164*67e74705SXin Li 
165*67e74705SXin Li // CHECK: call void @print(i8* {{.*}}, i32 411600)
166*67e74705SXin Li   print("f1", f1());
167*67e74705SXin Li   if (f1() != ORDER4(3, 5, 7, 2))
168*67e74705SXin Li     error();
169*67e74705SXin Li 
170*67e74705SXin Li // CHECK: call void @print(i8* {{.*}}, i32 246960)
171*67e74705SXin Li   print("f2", f2());
172*67e74705SXin Li   if (f2() != ORDER4(5, 3, 7, 2))
173*67e74705SXin Li     error();
174*67e74705SXin Li 
175*67e74705SXin Li // CHECK: call void @print(i8* {{.*}}, i32 1341648)
176*67e74705SXin Li   print("f3", f3());
177*67e74705SXin Li   if (f3() != ORDER4(7, 3, 11, 2))
178*67e74705SXin Li     error();
179*67e74705SXin Li 
180*67e74705SXin Li // CHECK: call void @print(i8* {{.*}}, i32 1176)
181*67e74705SXin Li   print("f4", f4());
182*67e74705SXin Li   if (f4() != ORDER3(3, 7, 2))
183*67e74705SXin Li     error();
184*67e74705SXin Li 
185*67e74705SXin Li // CHECK: call void @print(i8* {{.*}}, i32 246960)
186*67e74705SXin Li   print("f5", f5());
187*67e74705SXin Li   if (f5() != ORDER4(5, 3, 7, 2))
188*67e74705SXin Li     error();
189*67e74705SXin Li 
190*67e74705SXin Li // CHECK: call void @print(i8* {{.*}}, i32 1251552576)
191*67e74705SXin Li   print("f6", f6());
192*67e74705SXin Li   if (f6() != ORDER6(3, 7, 11, 5, 13, 2))
193*67e74705SXin Li     error();
194*67e74705SXin Li 
195*67e74705SXin Li //  CHECK: call void @print(i8* {{.*}}, i32 20)
196*67e74705SXin Li   print("f7", f7());
197*67e74705SXin Li   if (f7() != ORDER2(5, 2))
198*67e74705SXin Li     error();
199*67e74705SXin Li 
200*67e74705SXin Li //  CHECK: call void @print(i8* {{.*}}, i32 20)
201*67e74705SXin Li   print("f8", f8());
202*67e74705SXin Li   if (f8() != ORDER2(5, 2))
203*67e74705SXin Li     error();
204*67e74705SXin Li }
205*67e74705SXin Li 
206*67e74705SXin Li 
207*67e74705SXin Li 
208*67e74705SXin Li #ifdef HARNESS
209*67e74705SXin Li 
210*67e74705SXin Li #include <cstdlib>
211*67e74705SXin Li #include <cstdio>
212*67e74705SXin Li 
error()213*67e74705SXin Li extern "C" void error() {
214*67e74705SXin Li   abort();
215*67e74705SXin Li }
216*67e74705SXin Li 
print(const char * name,unsigned N)217*67e74705SXin Li extern "C" void print(const char *name, unsigned N) {
218*67e74705SXin Li   printf("%s: %d\n", name, N);
219*67e74705SXin Li }
220*67e74705SXin Li 
main()221*67e74705SXin Li int main() {
222*67e74705SXin Li   test();
223*67e74705SXin Li   return 0;
224*67e74705SXin Li }
225*67e74705SXin Li 
226*67e74705SXin Li #endif
227