aboutsummaryrefslogtreecommitdiff
path: root/gcc/genmatch.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-10-01 14:34:18 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-10-01 14:34:18 +0000
commitf00b6283fbc6d1489f403764fd25c64d37f18ad3 (patch)
tree950d06aa812fb57babca263e710c574a544041eb /gcc/genmatch.c
parent0f0565b1438c82118f1f31f6880c509c472c3bf5 (diff)
downloadgcc-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
Diffstat (limited to 'gcc/genmatch.c')
-rw-r--r--gcc/genmatch.c14
1 files changed, 9 insertions, 5 deletions
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)");