1*33224b22SAlex Crichton //! flags = ['-O2']
2*33224b22SAlex Crichton 
3*33224b22SAlex Crichton // clang-format off
4*33224b22SAlex Crichton // clang -o codegen-optimized.wasm -target wasm32-unknown-wasip1 -g -O2 codegen-optimized.cpp
5*33224b22SAlex Crichton 
6*33224b22SAlex Crichton // Make sure to adjust the break locations in lldb.rs when modifying this test.
7*33224b22SAlex Crichton #define BREAKPOINT
8*33224b22SAlex Crichton #define NOINLINE __attribute__((noinline))
9*33224b22SAlex Crichton 
NoInlineSideEffect()10*33224b22SAlex Crichton NOINLINE int NoInlineSideEffect() {
11*33224b22SAlex Crichton   volatile int x = 1;
12*33224b22SAlex Crichton   return x;
13*33224b22SAlex Crichton }
NoInlineSideEffect_TwoArgs(int a,int b)14*33224b22SAlex Crichton NOINLINE int NoInlineSideEffect_TwoArgs(int a, int b) {
15*33224b22SAlex Crichton   volatile int x[] = {1, 2, 3};
16*33224b22SAlex Crichton   return x[(a + b) >> 16];
17*33224b22SAlex Crichton }
18*33224b22SAlex Crichton 
VariableRanges_SingleVRegBrokenUp(int b)19*33224b22SAlex Crichton NOINLINE int VariableRanges_SingleVRegBrokenUp(int b) {
20*33224b22SAlex Crichton   if (b < 0) {
21*33224b22SAlex Crichton     __builtin_trap(); // This will split the live range of 'b'.
22*33224b22SAlex Crichton   }
23*33224b22SAlex Crichton   NoInlineSideEffect(); BREAKPOINT;
24*33224b22SAlex Crichton   return b;
25*33224b22SAlex Crichton }
26*33224b22SAlex Crichton 
VariableRanges_SingleVRegRegReused(int b)27*33224b22SAlex Crichton NOINLINE int VariableRanges_SingleVRegRegReused(int b) {
28*33224b22SAlex Crichton   int t = b & 420;
29*33224b22SAlex Crichton   NoInlineSideEffect_TwoArgs(t, b); BREAKPOINT;
30*33224b22SAlex Crichton   return 0;
31*33224b22SAlex Crichton }
32*33224b22SAlex Crichton 
InitializeTest(volatile int * x)33*33224b22SAlex Crichton NOINLINE void InitializeTest(volatile int *x) {
34*33224b22SAlex Crichton   *x = 42; // Have something to set a breakpoint on.
35*33224b22SAlex Crichton }
36*33224b22SAlex Crichton 
main(int argc,char * argv[])37*33224b22SAlex Crichton int main(int argc, char *argv[]) {
38*33224b22SAlex Crichton   volatile int x;
39*33224b22SAlex Crichton   InitializeTest(&x);
40*33224b22SAlex Crichton   VariableRanges_SingleVRegBrokenUp(x++);
41*33224b22SAlex Crichton   VariableRanges_SingleVRegRegReused(x++);
42*33224b22SAlex Crichton   return 0;
43*33224b22SAlex Crichton }
44