diff options
author | Jakub Jelinek <jakub@redhat.com> | 2015-02-12 10:45:27 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2015-02-12 10:45:27 +0100 |
commit | 01f834e33c2635b2e1ac7f8bb3bd0007c83a094d (patch) | |
tree | ea990aac53a7e77d5fea61ca8d0b5a2f67ce684c /gcc | |
parent | faedeff79d9d6d9b0f8bc560ce7b53cf4e2598e7 (diff) | |
download | gcc-01f834e33c2635b2e1ac7f8bb3bd0007c83a094d.zip gcc-01f834e33c2635b2e1ac7f8bb3bd0007c83a094d.tar.gz gcc-01f834e33c2635b2e1ac7f8bb3bd0007c83a094d.tar.bz2 |
re PR tree-optimization/65014 (ice with error: type mismatch in shift expression)
PR tree-optimization/65014
* fold-const.c (fold_binary_loc): When creating {L,R}ROTATE_EXPR,
use original second operand of arg0 or arg1 instead of
that adjusted by STRIP_NOPS.
* gcc.c-torture/compile/pr65014.c: New test.
From-SVN: r220640
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fold-const.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr65014.c | 10 |
4 files changed, 28 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c9ac045..723c62e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-02-12 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/65014 + * fold-const.c (fold_binary_loc): When creating {L,R}ROTATE_EXPR, + use original second operand of arg0 or arg1 instead of + that adjusted by STRIP_NOPS. + 2015-02-11 Jeff Law <law@redhat.com> PR target/63347 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index b4301c7..8377120 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -10261,7 +10261,9 @@ fold_binary_loc (location_t loc, tem = build2_loc (loc, LROTATE_EXPR, TREE_TYPE (TREE_OPERAND (arg0, 0)), TREE_OPERAND (arg0, 0), - code0 == LSHIFT_EXPR ? tree01 : tree11); + code0 == LSHIFT_EXPR + ? TREE_OPERAND (arg0, 1) + : TREE_OPERAND (arg1, 1)); return fold_convert_loc (loc, type, tem); } else if (code11 == MINUS_EXPR) @@ -10283,7 +10285,8 @@ fold_binary_loc (location_t loc, ? LROTATE_EXPR : RROTATE_EXPR), TREE_TYPE (TREE_OPERAND (arg0, 0)), - TREE_OPERAND (arg0, 0), tree01)); + TREE_OPERAND (arg0, 0), + TREE_OPERAND (arg0, 1))); } else if (code01 == MINUS_EXPR) { @@ -10304,7 +10307,7 @@ fold_binary_loc (location_t loc, ? LROTATE_EXPR : RROTATE_EXPR), TREE_TYPE (TREE_OPERAND (arg0, 0)), - TREE_OPERAND (arg0, 0), tree11)); + TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1))); } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8d5d3f3..dfd7230 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-02-12 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/65014 + * gcc.c-torture/compile/pr65014.c: New test. + 2015-02-11 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR libgfortran/57822 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr65014.c b/gcc/testsuite/gcc.c-torture/compile/pr65014.c new file mode 100644 index 0000000..c76e957 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr65014.c @@ -0,0 +1,10 @@ +/* PR tree-optimization/65014 */ +/* { dg-do compile { target int32plus } } */ + +extern int x; + +unsigned +foo (unsigned int y) +{ + return (y << ((__INTPTR_TYPE__) &x)) | (y >> (32 - ((__INTPTR_TYPE__) &x))); +} |