aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKazu Hirata <kazu@codesourcery.com>2006-05-21 15:16:19 +0000
committerKazu Hirata <kazu@gcc.gnu.org>2006-05-21 15:16:19 +0000
commit5104d6484ac0a63c35986266affd74c6499b7bc6 (patch)
tree42db309cbd8105eba46e1b4544b28424d9cee81a /gcc
parent4d49d44d6619d257f7635ef4c449d0b036add018 (diff)
downloadgcc-5104d6484ac0a63c35986266affd74c6499b7bc6.zip
gcc-5104d6484ac0a63c35986266affd74c6499b7bc6.tar.gz
gcc-5104d6484ac0a63c35986266affd74c6499b7bc6.tar.bz2
re PR middle-end/26622 (ICE in extract_insn, at recog.c:2084)
gcc/ PR tree-optimization/26622. * fold-const.c (fold_ternary) <COND_EXPR>: Call fold_convert on arg1. gcc/testsuite/ PR tree-optimization/26622. * gcc.c-torture/compile/pr26622.c: New. From-SVN: r113956
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/fold-const.c6
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr26622.c11
4 files changed, 22 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 94ba651..7d644b8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -5,6 +5,10 @@
simplifications of (eq/ne (xor x y) y) and
(eq/ne (xor x y) x).
+ PR tree-optimization/26622.
+ * fold-const.c (fold_ternary) <COND_EXPR>: Call fold_convert
+ on arg1.
+
2006-05-21 Bernhard Fischer <aldot@gcc.gnu.org>
* tree-cfg.c: Prune whitespace.
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index ef06eea..8672e48 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -11072,8 +11072,10 @@ fold_ternary (enum tree_code code, tree type, tree op0, tree op1, tree op2)
&& integer_zerop (TREE_OPERAND (arg0, 1))
&& integer_zerop (op2)
&& (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
- return fold_convert (type, fold_build2 (BIT_AND_EXPR,
- TREE_TYPE (tem), tem, arg1));
+ return fold_convert (type,
+ fold_build2 (BIT_AND_EXPR,
+ TREE_TYPE (tem), tem,
+ fold_convert (TREE_TYPE (tem), arg1)));
/* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N). A & 1 was
already handled above. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 11e358a..91f55ee 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -4,6 +4,9 @@
* gcc.c-torture/execute/pr27671-1.c: New.
* gcc.dg/pr27671-2.c: Likewise.
+ PR tree-optimization/26622.
+ * gcc.c-torture/compile/pr26622.c: New.
+
2006-05-21 Paul Thomas <pault@gcc.gnu.org>
PR fortran/27613
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr26622.c b/gcc/testsuite/gcc.c-torture/compile/pr26622.c
new file mode 100644
index 0000000..aea991e
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr26622.c
@@ -0,0 +1,11 @@
+/* PR middle-end/26622
+ fold_ternary used to create a tree with mismatching types, causing
+ (const_int 128) to appear in QImode rtx. */
+
+unsigned char g;
+
+unsigned long long
+foo (void)
+{
+ return ((long long) ((g & 0x80) != 0)) << 7;
+}