diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 2016-07-08 15:44:46 +0200 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 2016-07-08 15:44:46 +0200 |
commit | 4c7650c3eaf4dfbe5971864bf084e76f844051ee (patch) | |
tree | 32b5deb84cb3fd36f4baada8eed4ce108aed9599 /test/regression/builtins-ia32.c | |
parent | e73d5db97cdb22cce2ee479469f62af3c4b6264a (diff) | |
download | compcert-4c7650c3eaf4dfbe5971864bf084e76f844051ee.tar.gz compcert-4c7650c3eaf4dfbe5971864bf084e76f844051ee.zip |
Unwanted partial constant propagation in 64-bit integer arguments to builtins
Here are two examples that cause an internal error in Asmexpand.ml:
volatile long long x; void f(unsigned int i) { x = i; }
unsigned g(unsigned i) { return __builtin_clzll(i); }
The argument "i" to builtin volatile store or __builtin_clzll is turned into a BA_splitlong(BA_int 0, BA <variable i>), which Asmexpand.ml doesn't know how to handle.
The fix (in AST.builtin_arg_ok) is to prevent this 'optimization' for all builtins except those of the "OK_all" kind, i.e. __builtin_annot.
Regression tests were added and tested on IA32. Need to retest on ARM and PowerPC.
Diffstat (limited to 'test/regression/builtins-ia32.c')
-rw-r--r-- | test/regression/builtins-ia32.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/test/regression/builtins-ia32.c b/test/regression/builtins-ia32.c index 8df81800..9b7ed126 100644 --- a/test/regression/builtins-ia32.c +++ b/test/regression/builtins-ia32.c @@ -8,6 +8,7 @@ int main(int argc, char ** argv) unsigned int y = 0xDEADBEEF; unsigned long long xx = 0x1234567812345678ULL; unsigned long long yy = 0x1234567800000000ULL; + unsigned z; double a = 3.14159; double b = 2.718; double c = 1.414; @@ -18,9 +19,12 @@ int main(int argc, char ** argv) printf("clz(%x) = %d\n", x, __builtin_clz(x)); printf("clzll(%llx) = %d\n", (unsigned long long) x, __builtin_clzll(x)); printf("clzll(%llx) = %d\n", xx, __builtin_clzll(xx)); + z = __builtin_bswap(x); + printf("clzll(%lx) = %d\n", z, __builtin_clzll(z)); printf("ctz(%x) = %d\n", s, __builtin_ctz(s)); printf("ctzll(%llx) = %d\n", xx, __builtin_ctzll(xx)); printf("ctzll(%llx) = %d\n", yy, __builtin_ctzll(yy)); + printf("ctzll(%lx) = %d\n", z, __builtin_ctzll(z)); printf("fsqrt(%f) = %f\n", a, __builtin_fsqrt(a)); printf("fmin(%f, %f) = %f\n", a, b, __builtin_fmin(a, b)); |