diff options
author | Wei Guozhi <carrot@google.com> | 2011-07-29 01:27:29 +0000 |
---|---|---|
committer | Wei Guozhi <carrot@gcc.gnu.org> | 2011-07-29 01:27:29 +0000 |
commit | 154516d9d2011112deeb5becd98819d63397b2b1 (patch) | |
tree | 04bc619662014eaed8079e64815b5d6ac56e7ce9 /gcc | |
parent | 4bd1d898d253cbe668033d3ae85e203b090ba05c (diff) | |
download | gcc-154516d9d2011112deeb5becd98819d63397b2b1.zip gcc-154516d9d2011112deeb5becd98819d63397b2b1.tar.gz gcc-154516d9d2011112deeb5becd98819d63397b2b1.tar.bz2 |
re PR rtl-optimization/49799 (gcc arm generates illegal sbfx instruction)
PR rtl-optimization/49799
* combine.c (make_compound_operation): Check if the bit field is valid
before change it to bit field extraction.
* gcc.dg/pr49799.c: New test case.
From-SVN: r176911
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/combine.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr49799.c | 25 |
4 files changed, 37 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c304e82..0b70415 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-07-29 Wei Guozhi <carrot@google.com> + + PR rtl-optimization/49799 + * combine.c (make_compound_operation): Check if the bit field is valid + before change it to bit field extraction. + 2011-07-29 Bernd Schmidt <bernds@codesourcery.com> PR rtl-optimization/49891 diff --git a/gcc/combine.c b/gcc/combine.c index 4dbf022..b5cf245 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -7787,6 +7787,7 @@ make_compound_operation (rtx x, enum rtx_code in_code) && GET_CODE (lhs) == ASHIFT && CONST_INT_P (XEXP (lhs, 1)) && INTVAL (rhs) >= INTVAL (XEXP (lhs, 1)) + && INTVAL (XEXP (lhs, 1)) >= 0 && INTVAL (rhs) < mode_width) { new_rtx = make_compound_operation (XEXP (lhs, 0), next_code); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 85daf9f..d5e61cb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-07-29 Wei Guozhi <carrot@google.com> + + PR rtl-optimization/49799 + * gcc.dg/pr49799.c: New test case. + 2011-07-22 Sebastian Pop <sebastian.pop@amd.com> PR middle-end/48648 diff --git a/gcc/testsuite/gcc.dg/pr49799.c b/gcc/testsuite/gcc.dg/pr49799.c new file mode 100644 index 0000000..61ac261 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr49799.c @@ -0,0 +1,25 @@ +/* PR rtl-optimization/49799 */ +/* { dg-do assemble } */ +/* { dg-options "-O2 -w" } */ + +static __inline int bar(int a) +{ + int tmp; + + if (a <= 0) a ^= 0xFFFFFFFF; + + return tmp - 1; +} + +void foo(short *K) +{ + short tmp; + short *pptr, P[14]; + + pptr = P; + tmp = bar(*K); + *pptr = (*K << tmp) >> 16; + + if (*P < tmp) + *K++ = 0; +} |