diff options
author | Andreas Krebbel <krebbel1@de.ibm.com> | 2005-09-22 14:45:27 +0000 |
---|---|---|
committer | Andreas Krebbel <krebbel@gcc.gnu.org> | 2005-09-22 14:45:27 +0000 |
commit | 6231646a02eebc2006f91c628ffca8f875ec9ac5 (patch) | |
tree | d3ac8e3beb068ff1572011f2852f1c92262ee8f6 /gcc | |
parent | 7b9d4f7084b377ac50df11387983c5b4e6004137 (diff) | |
download | gcc-6231646a02eebc2006f91c628ffca8f875ec9ac5.zip gcc-6231646a02eebc2006f91c628ffca8f875ec9ac5.tar.gz gcc-6231646a02eebc2006f91c628ffca8f875ec9ac5.tar.bz2 |
expmed.c (expand_shift): Don't use the target of the rotate as target for the first expanded shift insn.
2005-09-22 Andreas Krebbel <krebbel1@de.ibm.com>
* expmed.c (expand_shift): Don't use the target of the rotate as
target for the first expanded shift insn.
* testsuite/gcc.dg/20050922-1.c: Testcase added.
From-SVN: r104528
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/expmed.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/20050922-1.c | 41 |
3 files changed, 49 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5ba52fe..f1a1d8e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-09-22 Andreas Krebbel <krebbel1@de.ibm.com> + + * expmed.c (expand_shift): Don't use the target of the rotate as + target for the first expanded shift insn. + * testsuite/gcc.dg/20050922-1.c: Testcase added. + 2005-09-21 Zdenek Dvorak <dvorakz@suse.cz> PR tree-optimization/22438 diff --git a/gcc/expmed.c b/gcc/expmed.c index 27a8b9b..5da9084 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -2227,9 +2227,9 @@ expand_shift (enum tree_code code, enum machine_mode mode, rtx shifted, shifted = force_reg (mode, shifted); temp = expand_shift (left ? LSHIFT_EXPR : RSHIFT_EXPR, - mode, shifted, new_amount, subtarget, 1); + mode, shifted, new_amount, 0, 1); temp1 = expand_shift (left ? RSHIFT_EXPR : LSHIFT_EXPR, - mode, shifted, other_amount, 0, 1); + mode, shifted, other_amount, subtarget, 1); return expand_binop (mode, ior_optab, temp, temp1, target, unsignedp, methods); } diff --git a/gcc/testsuite/gcc.dg/20050922-1.c b/gcc/testsuite/gcc.dg/20050922-1.c new file mode 100644 index 0000000..93410e5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/20050922-1.c @@ -0,0 +1,41 @@ +/* This revealed a bug when rotates are expanded into + two shifts. */ + +/* { dg-do run } */ +/* { dg-options "-O1 -std=c99" } */ + +#include <stdint.h> + +extern void abort (void); + +uint32_t +f (uint32_t *S, int j) +{ + uint32_t A, B, k, L[2] = {1234, 5678}; + int i, m; + + A = B = 0; + for (i = 0; i < j; i++) + { + k = (S[i] + A + B) & 0xffffffffL; + A = S[i] = + ((k << (3 & 0x1f)) | ((k & 0xffffffff) >> (32 - (3 & 0x1f)))); + + m = (int) (A + B); + k = (L[i] + A + B) & 0xffffffffL; + B = L[i] = + ((k << (m & 0x1f)) | ((k & 0xffffffff) >> (32 - (m & 0x1f)))); + } + return L[0] + L[1]; +} + +int +main () +{ + uint32_t S[2] = {0xffff, 0xffffff}; + + if (f (S,2)!= 1392607300) + abort(); + + return 0; +} |