diff --git a/llvm/test/Regression/LLC/bigstack.c b/llvm/test/Regression/LLC/bigstack.c new file mode 100644 index 000000000000..eacb76a7c37f --- /dev/null +++ b/llvm/test/Regression/LLC/bigstack.c @@ -0,0 +1,79 @@ +/*===- test/Regression/Transforms/Scalar/DecomposeMultiDimRefs.cpp -----=* + * + * This is a feature test that checks for correct code generation + * of the SAVE instruction when the stack size does not fit in the + * immediate field of the SAVE instruction. This happens in main(). + *===---------------------------------------------------------------------===*/ + +#include +#include + +typedef struct Flat_struct { + char c; + float x; +} Flat_t; + +typedef struct Mixed_struct { + int N; + double A[10]; + double B[10][10]; + Flat_t F[10]; +} Mixed_t; + + +double +AddMixed(Mixed_t* M) +{ + double sum = 0; + int i, j; + + for (i=0; i < 10; ++i) + sum += M->A[i]; + + for (i=0; i < 10; ++i) + for (j=0; j < 10; ++j) + sum += M->B[i][j]; + + for (i=0; i < 10; ++i) { + sum += (double) M->F[i].c; + sum += M->F[i].x; + } + + return sum; +} + +void +InitializeMixed(Mixed_t* M, int base) +{ + int i, j; + + for (i=0; i < 10; ++i) + M->A[i] = i + base; + + for (i=0; i < 10; ++i) + for (j=0; j < 10; ++j) + M->B[i][j] = i*10 + j + base; + + for (i=0; i < 10; ++i) { + M->F[i].c = 'Q'; + M->F[i].x = i / 10 + base; + } +} + +int +main(int argc, char** argv) +{ + Mixed_t M; + Mixed_t MA[4]; + int i; + + InitializeMixed(&M, 100); + printf("Sum(M) = %.2f\n", AddMixed(&M)); + + for (i=0; i < 4; i++) { + InitializeMixed(&MA[i], 100 * (i+2)); + printf("Sum(MA[%d]) = %.2f\n", i, AddMixed(&MA[i])); + } + + return 0; +}