aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-01-13 13:31:13 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-01-13 13:31:13 +0000
commit48f30f629fb6991ba1ddbd40385993a2a29457a8 (patch)
tree53f4a546ee8865499b7d85bcfaf0e4d567e56007
parent9e73c69087510db9321f4f6d91280519a643ff55 (diff)
downloadgcc-48f30f629fb6991ba1ddbd40385993a2a29457a8.zip
gcc-48f30f629fb6991ba1ddbd40385993a2a29457a8.tar.gz
gcc-48f30f629fb6991ba1ddbd40385993a2a29457a8.tar.bz2
re PR middle-end/42716 (ICE in extract_range_from_assert, at tree-vrp.c:1423)
2010-01-13 Richard Guenther <rguenther@suse.de> PR middle-end/42716 * fold-const.c (fold_unary_loc): Fold INDIRECT_REFs. * gcc.c-torture/compile/pr42716.c: New testcase. From-SVN: r155859
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/fold-const.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr42716.c18
4 files changed, 41 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5b291e6..1d66583 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2010-01-13 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/42716
+ * fold-const.c (fold_unary_loc): Fold INDIRECT_REFs.
+
2010-01-13 Jakub Jelinek <jakub@redhat.com>
PR debug/41371
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index e112621..9e40296 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -8942,6 +8942,19 @@ fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0)
}
return NULL_TREE;
+ case INDIRECT_REF:
+ /* Fold *&X to X if X is an lvalue. */
+ if (TREE_CODE (op0) == ADDR_EXPR)
+ {
+ tree op00 = TREE_OPERAND (op0, 0);
+ if ((TREE_CODE (op00) == VAR_DECL
+ || TREE_CODE (op00) == PARM_DECL
+ || TREE_CODE (op00) == RESULT_DECL)
+ && !TREE_READONLY (op00))
+ return op00;
+ }
+ return NULL_TREE;
+
default:
return NULL_TREE;
} /* switch (code) */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f8532af..38241e2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2010-01-13 Richard Guenther <rguenther@suse.de>
+ PR middle-end/42716
+ * gcc.c-torture/compile/pr42716.c: New testcase.
+
+2010-01-13 Richard Guenther <rguenther@suse.de>
+
PR lto/42678
* gfortran.dg/lto/20100110-1_0.f90: New testcase.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr42716.c b/gcc/testsuite/gcc.c-torture/compile/pr42716.c
new file mode 100644
index 0000000..e52df0f
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr42716.c
@@ -0,0 +1,18 @@
+static short foo (long long si1, short si2)
+{
+ return si1 > 0 && si2 > 0 || si1 < 0
+ && si2 < 0 && si1 < 1 - si2 ? : si1 + si2;
+}
+
+int g_13;
+unsigned g_17;
+
+int safe (int, int);
+
+void bar (short p_51, short * p_52)
+{
+ int *const l_55 = &g_13;
+ if (safe (*p_52, g_13 != foo (*p_52 & *l_55 == g_13 && g_17 >= 1, 0)))
+ {
+ }
+}