diff options
author | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-08-21 06:01:23 +0000 |
---|---|---|
committer | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-08-21 06:01:23 +0000 |
commit | d9064fbabda44966190ef815a65d4fcf25b78bce (patch) | |
tree | ad81ecce6e9486fcfb0ac5437f5ec61bb4ecb80a | |
parent | 3a1dbb74db1df11299dbe451544d53df5d84e063 (diff) | |
download | gcc-d9064fbabda44966190ef815a65d4fcf25b78bce.tar.gz |
* config/alpha/alpha.md (exception_receiver): Emit alternative
GP load sequence if flag_reorder_blocks_and_partition is set.
(*exception_receiver_2): Also enable when
flag_reorder_blocks_and_partition is set.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@150984 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/alpha/alpha.md | 12 |
2 files changed, 17 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c0d98c13adf..225e96e192a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-08-21 Uros Bizjak <ubizjak@gmail.com> + + * config/alpha/alpha.md (exception_receiver): Emit alternative + GP load sequence if flag_reorder_blocks_and_partition is set. + (*exception_receiver_2): Also enable when + flag_reorder_blocks_and_partition is set. + 2009-08-20 Matt Rice <ratmice@gmail.com> Diego Novillo <dnovillo@google.com> diff --git a/gcc/config/alpha/alpha.md b/gcc/config/alpha/alpha.md index 18817c80c52..67ccff581ba 100644 --- a/gcc/config/alpha/alpha.md +++ b/gcc/config/alpha/alpha.md @@ -6855,11 +6855,18 @@ "br $27,$LSJ%=\n$LSJ%=:" [(set_attr "type" "ibr")]) +;; When flag_reorder_blocks_and_partition is in effect, compiler puts +;; exception landing pads in a cold section. To prevent inter-section offset +;; calculation, a jump to original landing pad is emitted in the place of the +;; original landing pad. Since landing pad is moved, RA-relative GP +;; calculation in the prologue of landing pad breaks. To solve this problem, +;; we use alternative GP load approach, as in the case of TARGET_LD_BUGGY_LDGP. + (define_expand "exception_receiver" [(unspec_volatile [(match_dup 0)] UNSPECV_EHR)] "TARGET_ABI_OSF" { - if (TARGET_LD_BUGGY_LDGP) + if (TARGET_LD_BUGGY_LDGP || flag_reorder_blocks_and_partition) operands[0] = alpha_gp_save_rtx (); else operands[0] = const0_rtx; @@ -6867,7 +6874,8 @@ (define_insn "*exception_receiver_2" [(unspec_volatile [(match_operand:DI 0 "memory_operand" "m")] UNSPECV_EHR)] - "TARGET_ABI_OSF && TARGET_LD_BUGGY_LDGP" + "TARGET_ABI_OSF + && (TARGET_LD_BUGGY_LDGP || flag_reorder_blocks_and_partition)" "ldq $29,%0" [(set_attr "type" "ild")]) |