Commit 38384150 by Jakub Jelinek Committed by Jakub Jelinek

re PR inline-asm/50571 (Undesirable folding in "m" constrained asm operands)

	PR inline-asm/50571
	* gimple-fold.c (fold_stmt_1) <case GIMPLE_ASM>: If
	input constraints allow mem and not reg, pass true instead of
	false as second argument to maybe_fold_reference.

	* gcc.dg/pr50571.c: New test.

From-SVN: r179389
parent 0ccb5dbf
2011-09-30 Jakub Jelinek <jakub@redhat.com> 2011-09-30 Jakub Jelinek <jakub@redhat.com>
PR inline-asm/50571
* gimple-fold.c (fold_stmt_1) <case GIMPLE_ASM>: If
input constraints allow mem and not reg, pass true instead of
false as second argument to maybe_fold_reference.
PR tree-optimization/46309 PR tree-optimization/46309
* fold-const.c (make_range, merge_ranges): Remove prototypes. * fold-const.c (make_range, merge_ranges): Remove prototypes.
(make_range_step): New function. (make_range_step): New function.
...@@ -1201,28 +1201,45 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace) ...@@ -1201,28 +1201,45 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace)
case GIMPLE_ASM: case GIMPLE_ASM:
/* Fold *& in asm operands. */ /* Fold *& in asm operands. */
for (i = 0; i < gimple_asm_noutputs (stmt); ++i) {
{ size_t noutputs;
tree link = gimple_asm_output_op (stmt, i); const char **oconstraints;
tree op = TREE_VALUE (link); const char *constraint;
if (REFERENCE_CLASS_P (op) bool allows_mem, allows_reg;
&& (op = maybe_fold_reference (op, true)) != NULL_TREE)
{ noutputs = gimple_asm_noutputs (stmt);
TREE_VALUE (link) = op; oconstraints = XALLOCAVEC (const char *, noutputs);
changed = true;
} for (i = 0; i < gimple_asm_noutputs (stmt); ++i)
} {
for (i = 0; i < gimple_asm_ninputs (stmt); ++i) tree link = gimple_asm_output_op (stmt, i);
{ tree op = TREE_VALUE (link);
tree link = gimple_asm_input_op (stmt, i); oconstraints[i]
tree op = TREE_VALUE (link); = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
if (REFERENCE_CLASS_P (op) if (REFERENCE_CLASS_P (op)
&& (op = maybe_fold_reference (op, false)) != NULL_TREE) && (op = maybe_fold_reference (op, true)) != NULL_TREE)
{ {
TREE_VALUE (link) = op; TREE_VALUE (link) = op;
changed = true; changed = true;
} }
} }
for (i = 0; i < gimple_asm_ninputs (stmt); ++i)
{
tree link = gimple_asm_input_op (stmt, i);
tree op = TREE_VALUE (link);
constraint
= TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
parse_input_constraint (&constraint, 0, 0, noutputs, 0,
oconstraints, &allows_mem, &allows_reg);
if (REFERENCE_CLASS_P (op)
&& (op = maybe_fold_reference (op, !allows_reg && allows_mem))
!= NULL_TREE)
{
TREE_VALUE (link) = op;
changed = true;
}
}
}
break; break;
case GIMPLE_DEBUG: case GIMPLE_DEBUG:
......
2011-09-30 Jakub Jelinek <jakub@redhat.com> 2011-09-30 Jakub Jelinek <jakub@redhat.com>
PR inline-asm/50571
* gcc.dg/pr50571.c: New test.
PR tree-optimization/46309 PR tree-optimization/46309
* gcc.dg/pr46309.c: New test. * gcc.dg/pr46309.c: New test.
......
/* PR inline-asm/50571 */
/* { dg-do compile } */
/* { dg-options "-O2" } */
static const int var[4] = { 1, 2, 3, 4 };
void
foo (void)
{
__asm volatile ("" : : "m" (*(int *) var));
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment