diff options
author | Richard Biener <rguenther@suse.de> | 2016-10-01 14:34:18 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-10-01 14:34:18 +0000 |
commit | f00b6283fbc6d1489f403764fd25c64d37f18ad3 (patch) | |
tree | 950d06aa812fb57babca263e710c574a544041eb | |
parent | 0f0565b1438c82118f1f31f6880c509c472c3bf5 (diff) | |
download | gcc-f00b6283fbc6d1489f403764fd25c64d37f18ad3.zip gcc-f00b6283fbc6d1489f403764fd25c64d37f18ad3.tar.gz gcc-f00b6283fbc6d1489f403764fd25c64d37f18ad3.tar.bz2 |
re PR middle-end/77798 (465.tonto ICE with trunk with -O2)
2016-10-01 Richard Biener <rguenther@suse.de>
PR middle-end/77798
* genmatch.c (get_operand_type): Add operand position arg
and handle COND_EXPR comparison operand with fixed boolean_type_node.
(expr::gen_transform): Adjust.
(dt_simplify::gen_1): Likewise.
* gfortran.fortran-torture/compile/pr77798.f90: New testcase.
From-SVN: r240696
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/genmatch.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.fortran-torture/compile/pr77798.f90 | 17 |
4 files changed, 39 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d432fe0..9085071 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2016-10-01 Richard Biener <rguenther@suse.de> + + PR middle-end/77798 + * genmatch.c (get_operand_type): Add operand position arg + and handle COND_EXPR comparison operand with fixed boolean_type_node. + (expr::gen_transform): Adjust. + (dt_simplify::gen_1): Likewise. + 2016-10-01 Jakub Jelinek <jakub@redhat.com> * config/i386/sse.md (<mask_codefor><code><mode>): Add FALLTHRU diff --git a/gcc/genmatch.c b/gcc/genmatch.c index 6195a3b..aa291ec 100644 --- a/gcc/genmatch.c +++ b/gcc/genmatch.c @@ -2216,11 +2216,12 @@ is_conversion (id_base *op) || *op == VIEW_CONVERT_EXPR); } -/* Get the type to be used for generating operands of OP from the +/* Get the type to be used for generating operand POS of OP from the various sources. */ static const char * -get_operand_type (id_base *op, const char *in_type, +get_operand_type (id_base *op, unsigned pos, + const char *in_type, const char *expr_type, const char *other_oprnd_type) { @@ -2235,6 +2236,9 @@ get_operand_type (id_base *op, const char *in_type, else if (is_a <operator_id *> (op) && strcmp (as_a <operator_id *> (op)->tcc, "tcc_comparison") == 0) return other_oprnd_type; + else if (*op == COND_EXPR + && pos == 0) + return "boolean_type_node"; else { /* Otherwise all types should match - choose one in order of @@ -2319,7 +2323,7 @@ expr::gen_transform (FILE *f, int indent, const char *dest, bool gimple, char dest[32]; snprintf (dest, 32, "ops%d[%u]", depth, i); const char *optype - = get_operand_type (opr, in_type, expr_type, + = get_operand_type (opr, i, in_type, expr_type, i == 0 ? NULL : op0type); ops[i]->gen_transform (f, indent, dest, gimple, depth + 1, optype, cinfo, indexes, @@ -3157,7 +3161,7 @@ dt_simplify::gen_1 (FILE *f, int indent, bool gimple, operand *result) char dest[32]; snprintf (dest, 32, "res_ops[%d]", j); const char *optype - = get_operand_type (opr, + = get_operand_type (opr, j, "type", e->expr_type, j == 0 ? NULL : "TREE_TYPE (res_ops[0])"); /* We need to expand GENERIC conditions we captured from @@ -3247,7 +3251,7 @@ dt_simplify::gen_1 (FILE *f, int indent, bool gimple, operand *result) snprintf (dest, 32, "res_op%d", j); } const char *optype - = get_operand_type (opr, + = get_operand_type (opr, j, "type", e->expr_type, j == 0 ? NULL : "TREE_TYPE (res_op0)"); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index feb7877..6e58203 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-10-01 Richard Biener <rguenther@suse.de> + + PR middle-end/77798 + * gfortran.fortran-torture/compile/pr77798.f90: New testcase. + 2016-10-01 Andre Vehreschild <vehre@gcc.gnu.org> PR fortran/77663 diff --git a/gcc/testsuite/gfortran.fortran-torture/compile/pr77798.f90 b/gcc/testsuite/gfortran.fortran-torture/compile/pr77798.f90 new file mode 100644 index 0000000..6002169 --- /dev/null +++ b/gcc/testsuite/gfortran.fortran-torture/compile/pr77798.f90 @@ -0,0 +1,17 @@ +subroutine foo(self,value) +integer(kind=kind(1)), dimension(:) :: self +integer(kind=kind(1)), intent(in) :: value +integer(kind=kind(1)) :: x,y,sign +intent(inout) :: self +integer(kind=kind(1)) :: len,i + +len = size(self) +do i = 1,len + x = self(i) + if (x==0.0d0) cycle + y = abs(x) + sign = x/y + self(i) = sign*min(value,y) +end do + +end subroutine |