+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
|| *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)
{
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
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,
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
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)");
--- /dev/null
+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