aboutsummaryrefslogtreecommitdiffstats
path: root/test/regression/builtins-powerpc.c
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>2016-07-08 15:44:46 +0200
committerXavier Leroy <xavier.leroy@inria.fr>2016-07-08 15:44:46 +0200
commit4c7650c3eaf4dfbe5971864bf084e76f844051ee (patch)
tree32b5deb84cb3fd36f4baada8eed4ce108aed9599 /test/regression/builtins-powerpc.c
parente73d5db97cdb22cce2ee479469f62af3c4b6264a (diff)
downloadcompcert-kvx-4c7650c3eaf4dfbe5971864bf084e76f844051ee.tar.gz
compcert-kvx-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-powerpc.c')
-rw-r--r--test/regression/builtins-powerpc.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/test/regression/builtins-powerpc.c b/test/regression/builtins-powerpc.c
index 1d220c11..23e9d191 100644
--- a/test/regression/builtins-powerpc.c
+++ b/test/regression/builtins-powerpc.c
@@ -14,6 +14,7 @@ int main(int argc, char ** argv)
unsigned int x = 0x12345678;
unsigned int y = 0xDEADBEEF;
unsigned long long xx = 0x1234567812345678ULL;
+ unsigned z;
double a = 3.14159;
double b = 2.718;
double c = 1.414;
@@ -24,6 +25,8 @@ 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("bswap(%x) = %x\n", x, __builtin_bswap(x));
printf("bswap16(%x) = %x\n", s, __builtin_bswap16(s));