aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2015-02-12 10:45:27 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2015-02-12 10:45:27 +0100
commit01f834e33c2635b2e1ac7f8bb3bd0007c83a094d (patch)
treeea990aac53a7e77d5fea61ca8d0b5a2f67ce684c /gcc/fold-const.c
parentfaedeff79d9d6d9b0f8bc560ce7b53cf4e2598e7 (diff)
downloadgcc-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/fold-const.c')
-rw-r--r--gcc/fold-const.c9
1 files changed, 6 insertions, 3 deletions
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)));
}
}
}