From e17a74dc04882a3420925b02c36f96f20b979603 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Wed, 20 Jun 2012 13:55:44 +0000 Subject: [PATCH] backport: [multiple changes] 2012-06-20 Richard Guenther Backport from mainline 2010-12-18 Jakub Jelinek PR tree-optimization/46985 * tree-scalar-evolution.c (instantiate_scev_r): If chrec is NULL, return it immediately. * gfortran.dg/pr46985.f90: New test. 2011-02-18 Jakub Jelinek PR debug/47780 * cfgexpand.c (expand_debug_expr) : Call copy_rtx to avoid invalid rtx sharing. * gcc.target/i386/pr47780.c: New test. 2011-02-27 Jakub Jelinek PR middle-end/47903 * real.c (real_arithmetic) : Clear padding bits in *r first if r isn't op0 nor op1. From-SVN: r188834 --- gcc/ChangeLog | 22 ++++++++++++++++++++++ gcc/cfgexpand.c | 2 +- gcc/real.c | 10 ++++++++++ gcc/testsuite/ChangeLog | 13 +++++++++++++ gcc/testsuite/gcc.target/i386/pr47780.c | 14 ++++++++++++++ gcc/testsuite/gfortran.dg/pr46985.f90 | 17 +++++++++++++++++ gcc/tree-scalar-evolution.c | 3 ++- 7 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr47780.c create mode 100644 gcc/testsuite/gfortran.dg/pr46985.f90 diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f2af76d84f1f..4ea22dc71a02 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,25 @@ +2012-06-20 Richard Guenther + + Backport from mainline + 2010-12-18 Jakub Jelinek + + PR tree-optimization/46985 + * tree-scalar-evolution.c (instantiate_scev_r): If chrec is NULL, + return it immediately. + + 2011-02-18 Jakub Jelinek + + PR debug/47780 + * cfgexpand.c (expand_debug_expr) : Call copy_rtx to + avoid invalid rtx sharing. + + 2011-02-27 Jakub Jelinek + + PR middle-end/47903 + * real.c (real_arithmetic) : Clear padding bits in *r first if + r isn't op0 nor op1. + 2012-06-04 Edmar Wienskoski * config/rs6000/altivec.md (altivec_stvlx): Change machine mode of diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 9cc0432fd9be..a4c2e15e51cc 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -2974,7 +2974,7 @@ expand_debug_expr (tree exp) gcc_assert (part >= 0 && (unsigned)part < SA.map->num_partitions); - op0 = SA.partition_to_pseudo[part]; + op0 = copy_rtx (SA.partition_to_pseudo[part]); } goto adjust_mode; } diff --git a/gcc/real.c b/gcc/real.c index 25e599dfe352..f9d138c519e4 100644 --- a/gcc/real.c +++ b/gcc/real.c @@ -1008,15 +1008,25 @@ real_arithmetic (REAL_VALUE_TYPE *r, int icode, const REAL_VALUE_TYPE *op0, switch (code) { case PLUS_EXPR: + /* Clear any padding areas in *r if it isn't equal to one of the + operands so that we can later do bitwise comparisons later on. */ + if (r != op0 && r != op1) + memset (r, '\0', sizeof (*r)); return do_add (r, op0, op1, 0); case MINUS_EXPR: + if (r != op0 && r != op1) + memset (r, '\0', sizeof (*r)); return do_add (r, op0, op1, 1); case MULT_EXPR: + if (r != op0 && r != op1) + memset (r, '\0', sizeof (*r)); return do_multiply (r, op0, op1); case RDIV_EXPR: + if (r != op0 && r != op1) + memset (r, '\0', sizeof (*r)); return do_divide (r, op0, op1); case MIN_EXPR: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 54defb66a3d9..d682c613034e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,16 @@ +2012-06-20 Richard Guenther + + Backport from mainline + 2010-12-18 Jakub Jelinek + + PR tree-optimization/46985 + * gfortran.dg/pr46985.f90: New test. + + 2011-02-18 Jakub Jelinek + + PR debug/47780 + * gcc.target/i386/pr47780.c: New test. + 2012-06-04 Edmar Wienskoski * gcc.target/powerpc/cell_builtin_1.c: New test case. diff --git a/gcc/testsuite/gcc.target/i386/pr47780.c b/gcc/testsuite/gcc.target/i386/pr47780.c new file mode 100644 index 000000000000..89fe4093dfc4 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr47780.c @@ -0,0 +1,14 @@ +/* PR debug/47780 */ +/* { dg-do compile } */ +/* { dg-options "-O -fgcse -fgcse-las -fstack-protector-all -fno-tree-ccp -fno-tree-dominator-opts -fcompare-debug -Wno-psabi" } */ + +typedef int V2SF __attribute__ ((vector_size (128))); + +V2SF +foo (int x, V2SF a) +{ + V2SF b = a + (V2SF) {}; + while (x--) + a += b; + return a; +} diff --git a/gcc/testsuite/gfortran.dg/pr46985.f90 b/gcc/testsuite/gfortran.dg/pr46985.f90 new file mode 100644 index 000000000000..141641d29e99 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr46985.f90 @@ -0,0 +1,17 @@ +! PR tree-optimization/46985 +! { dg-do compile } +! { dg-options "-O -ftree-pre -ftree-vrp -fno-tree-ccp -fno-tree-dominator-opts -fno-tree-fre" } + + type :: t + integer :: i + end type t + type(t), target :: tar(2) = (/t(2), t(4)/) + integer, pointer :: ptr(:) + ptr => tar%i + call foo (ptr) +contains + subroutine foo (arg) + integer :: arg(:) + arg = arg - 1 + end subroutine +end diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c index 054c6435c00e..ca5f36a029c8 100644 --- a/gcc/tree-scalar-evolution.c +++ b/gcc/tree-scalar-evolution.c @@ -2557,7 +2557,8 @@ instantiate_scev_r (basic_block instantiate_below, if (size_expr++ > PARAM_VALUE (PARAM_SCEV_MAX_EXPR_SIZE)) return chrec_dont_know; - if (automatically_generated_chrec_p (chrec) + if (chrec == NULL_TREE + || automatically_generated_chrec_p (chrec) || is_gimple_min_invariant (chrec)) return chrec; -- 2.47.2