aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <pinskia@gmail.com>2006-11-28 23:23:11 -0800
committerAndrew Pinski <pinskia@gcc.gnu.org>2006-11-28 23:23:11 -0800
commite969dbde29bfd396259357aa54a54f38f09ff593 (patch)
tree869f90739651886a919f4571e43bead73dcdfefa /gcc
parentfd074cfecc4d544776f7c1ba12882e5023dd2c79 (diff)
downloadgcc-e969dbde29bfd396259357aa54a54f38f09ff593.zip
gcc-e969dbde29bfd396259357aa54a54f38f09ff593.tar.gz
gcc-e969dbde29bfd396259357aa54a54f38f09ff593.tar.bz2
re PR tree-optimization/29984 (SPE GCC segfaults with MAX_EXPR <a, a>)
2006-11-28 Andrew Pinski <pinskia@gmail.com> PR tree-opt/29984 * gcc.dg/tree-ssa/reassoc-12.c: New test. 2006-11-28 Andrew Pinski <pinskia@gmail.com> PR tree-opt/29984 * tree-ssa-reassoc.c (eliminate_duplicate_pair): Handle MAX_EXPR and MIN_EXRP. From-SVN: r119303
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/reassoc-12.c11
-rw-r--r--gcc/tree-ssa-reassoc.c8
4 files changed, 27 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fb46791..c838be7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2006-11-28 Andrew Pinski <pinskia@gmail.com>
+
+ PR tree-opt/29984
+ * tree-ssa-reassoc.c (eliminate_duplicate_pair): Handle MAX_EXPR
+ and MIN_EXRP.
+
2006-11-28 Bob Wilson <bob.wilson@acm.org>
* config/xtensa/lib1funcs.asm (__umulsidi3): Restore a12-a15 on exit.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8d9d9e4..a08b86a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-11-28 Andrew Pinski <pinskia@gmail.com>
+
+ PR tree-opt/29984
+ * gcc.dg/tree-ssa/reassoc-12.c: New test.
+
2006-11-28 Jan Hubicka <jh@suse.cz>
* gcc.dg/memcpy-1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-12.c b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-12.c
new file mode 100644
index 0000000..65e2931
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-12.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-reassoc1-details" } */
+int f(int a, int b)
+{
+ /* MAX_EXPR <a, a> should cause it to be equivalent to a. */
+ int c = a>=b?a:b;
+ int d = c>=a?c:a;
+ return d;
+}
+/* { dg-final { scan-tree-dump-times "Equivalence:" 1 "reassoc1"} } */
+/* { dg-final { cleanup-tree-dump "reassoc1" } } */
diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c
index 6835a17..8b5d34a 100644
--- a/gcc/tree-ssa-reassoc.c
+++ b/gcc/tree-ssa-reassoc.c
@@ -417,8 +417,8 @@ eliminate_duplicate_pair (enum tree_code opcode,
operand_entry_t last)
{
- /* If we have two of the same op, and the opcode is & or |, we can
- eliminate one of them.
+ /* If we have two of the same op, and the opcode is & |, min, or max,
+ we can eliminate one of them.
If we have two of the same op, and the opcode is ^, we can
eliminate both of them. */
@@ -426,13 +426,15 @@ eliminate_duplicate_pair (enum tree_code opcode,
{
switch (opcode)
{
+ case MAX_EXPR:
+ case MIN_EXPR:
case BIT_IOR_EXPR:
case BIT_AND_EXPR:
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, "Equivalence: ");
print_generic_expr (dump_file, curr->op, 0);
- fprintf (dump_file, " [&|] ");
+ fprintf (dump_file, " [&|minmax] ");
print_generic_expr (dump_file, last->op, 0);
fprintf (dump_file, " -> ");
print_generic_stmt (dump_file, last->op, 0);