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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@164245
138bc75d-0d04-0410-961f-
82ee72b054a4
+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
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)
&& 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));
}
+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.
--- /dev/null
+-- { 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" } }