re PR middle-end/45819 (unexpected unaligned access to volatile int)
2011-07-22 Richard Guenther <rguenther@suse.de> PR tree-optimization/45819 * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Properly preserve volatile and notrap flags. * gcc.dg/pr45819.c: New testcase. From-SVN: r176623
This commit is contained in:
parent
679debeea3
commit
27315aa68f
|
@ -1,3 +1,9 @@
|
|||
2011-07-22 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/45819
|
||||
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Properly
|
||||
preserve volatile and notrap flags.
|
||||
|
||||
2011-07-22 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
|
||||
Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
|
||||
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2011-07-22 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/45819
|
||||
* gcc.dg/pr45819.c: New testcase.
|
||||
|
||||
2011-07-22 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
* lib/target-supports.exp (check_ifunc_available): Rewrite.
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-tree-optimized" } */
|
||||
|
||||
struct ehci_regs {
|
||||
char x;
|
||||
unsigned int port_status[0];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct ehci_hcd {
|
||||
struct ehci_regs *regs;
|
||||
};
|
||||
|
||||
int ehci_hub_control (struct ehci_hcd *ehci, int wIndex)
|
||||
{
|
||||
unsigned int *status_reg = &ehci->regs->port_status[wIndex];
|
||||
return *(volatile unsigned int *)status_reg;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump "={v}" "optimized" } } */
|
||||
/* { dg-final { cleanup-tree-dump "optimized" } } */
|
|
@ -875,6 +875,8 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
|
|||
}
|
||||
*def_rhs_basep = build2 (MEM_REF, TREE_TYPE (*def_rhs_basep),
|
||||
new_base, new_offset);
|
||||
TREE_THIS_VOLATILE (*def_rhs_basep) = TREE_THIS_VOLATILE (lhs);
|
||||
TREE_THIS_NOTRAP (*def_rhs_basep) = TREE_THIS_NOTRAP (lhs);
|
||||
gimple_assign_set_lhs (use_stmt,
|
||||
unshare_expr (TREE_OPERAND (def_rhs, 0)));
|
||||
*def_rhs_basep = saved;
|
||||
|
@ -927,9 +929,9 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
|
|||
tidy_after_forward_propagate_addr (use_stmt);
|
||||
return res;
|
||||
}
|
||||
/* If the LHS is a plain dereference and the value type is the same as
|
||||
/* If the RHS is a plain dereference and the value type is the same as
|
||||
that of the pointed-to type of the address we can put the
|
||||
dereferenced address on the LHS preserving the original alias-type. */
|
||||
dereferenced address on the RHS preserving the original alias-type. */
|
||||
else if (gimple_assign_rhs1 (use_stmt) == rhs
|
||||
&& useless_type_conversion_p
|
||||
(TREE_TYPE (gimple_assign_lhs (use_stmt)),
|
||||
|
@ -954,6 +956,8 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
|
|||
}
|
||||
*def_rhs_basep = build2 (MEM_REF, TREE_TYPE (*def_rhs_basep),
|
||||
new_base, new_offset);
|
||||
TREE_THIS_VOLATILE (*def_rhs_basep) = TREE_THIS_VOLATILE (rhs);
|
||||
TREE_THIS_NOTRAP (*def_rhs_basep) = TREE_THIS_NOTRAP (rhs);
|
||||
gimple_assign_set_rhs1 (use_stmt,
|
||||
unshare_expr (TREE_OPERAND (def_rhs, 0)));
|
||||
*def_rhs_basep = saved;
|
||||
|
|
Loading…
Reference in New Issue