fwprop.c (forward_propagate_and_simplify): Only attach a REG_EQUAL note to an insn if the destination is a register.

* fwprop.c (forward_propagate_and_simplify): Only attach a
        REG_EQUAL note to an insn if the destination is a register.
        * gcse.c (try_replace_reg): Likewise.

        testsuite/
        * gnat.dg/memtrap.adb: New test.

From-SVN: r164245
This commit is contained in:
Olivier Hainque 2010-09-13 14:18:31 +00:00 committed by Olivier Hainque
parent 654a61fb34
commit 2f434b97f1
5 changed files with 49 additions and 10 deletions

View file

@ -1,3 +1,9 @@
2010-09-13 Olivier Hainque <hainque@adacore.com>
* fwprop.c (forward_propagate_and_simplify): Only attach a
REG_EQUAL note to an insn if the destination is a register.
* gcse.c (try_replace_reg): Likewise.
2010-09-13 Richard Guenther <rguenther@suse.de>
PR tree-optimization/45611

View file

@ -1294,10 +1294,11 @@ forward_propagate_and_simplify (df_ref use, rtx def_insn, rtx def_set)
loc = &SET_SRC (use_set);
/* Do not replace an existing REG_EQUAL note if the insn is not
recognized. Either we're already replacing in the note, or
we'll separately try plugging the definition in the note and
simplifying. */
set_reg_equal = (note == NULL_RTX);
recognized. Either we're already replacing in the note, or we'll
separately try plugging the definition in the note and simplifying.
And only install a REQ_EQUAL note when the destination is a REG,
as the note would be invalid otherwise. */
set_reg_equal = (note == NULL_RTX && REG_P (SET_DEST (use_set)));
}
if (GET_MODE (*loc) == VOIDmode)

View file

@ -2351,12 +2351,10 @@ try_replace_reg (rtx from, rtx to, rtx insn)
&& validate_change (insn, &SET_SRC (set), src, 0))
success = 1;
/* If we've failed to do replacement, have a single SET, don't already
have a note, and have no special SET, add a REG_EQUAL note to not
lose information. */
if (!success && note == 0 && set != 0
&& GET_CODE (SET_DEST (set)) != ZERO_EXTRACT
&& GET_CODE (SET_DEST (set)) != STRICT_LOW_PART)
/* If we've failed perform the replacement, have a single SET to
a REG destination and don't yet have a note, add a REG_EQUAL note
to not lose information. */
if (!success && note == 0 && set != 0 && REG_P (SET_DEST (set)))
note = set_unique_reg_note (insn, REG_EQUAL, copy_rtx (src));
}

View file

@ -1,3 +1,7 @@
2010-09-12 Olivier Hainque <hainque@adacore.com>
* gnat.dg/memtrap.adb: New test.
2010-09-11 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
* gfortran.dg/promotion.f90: Fix options.

View file

@ -0,0 +1,30 @@
-- { dg-do compile }
-- { dg-options "-O2" }
with System;
procedure Memtrap is
X : integer;
for X'address use System.Null_Address;
begin
X := 12;
exception
when others => null;
end;
-- { dg-final { scan-assembler "__gnat_begin_handler" } }
-- { dg-do compile }
-- { dg-options "-O2" }
with System;
procedure Memtrap is
X : integer;
for X'address use System.Null_Address;
begin
X := 12;
exception
when others => null;
end;
-- { dg-final { scan-assembler "__gnat_begin_handler|__gnat_raise_nodefer" } }