diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-08-14 20:28:11 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-08-14 20:28:11 +0000 |
commit | fac3b9dea75ac8cc1058b9cea47764b6bdab08f2 (patch) | |
tree | ad82a4c0f4c17b838f1008f28729361acbb7aa4d /gcc/config/ia64/ia64.md | |
parent | 19371d67bac564bf7d51557ec73efaa872735fbb (diff) | |
download | gcc-fac3b9dea75ac8cc1058b9cea47764b6bdab08f2.tar.gz |
* config/ia64/ia64.md (movdi): Delay calling ia64_expand_load_address.
(movdi_symbolic): New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@35685 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/ia64/ia64.md')
-rw-r--r-- | gcc/config/ia64/ia64.md | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/gcc/config/ia64/ia64.md b/gcc/config/ia64/ia64.md index 6a30393494e..4a68623c13c 100644 --- a/gcc/config/ia64/ia64.md +++ b/gcc/config/ia64/ia64.md @@ -351,14 +351,21 @@ "" " { + if (! reload_in_progress && ! reload_completed + && ! ia64_move_ok (operands[0], operands[1])) + operands[1] = force_reg (DImode, operands[1]); if (! TARGET_NO_PIC && symbolic_operand (operands[1], DImode)) { - ia64_expand_load_address (operands[0], operands[1]); + /* Before optimization starts, delay committing to any particular + type of PIC address load. If this function gets deferred, we + may acquire information that changes the value of the + sdata_symbolic_operand predicate. */ + if (rtx_equal_function_value_matters) + emit_insn (gen_movdi_symbolic (operands[0], operands[1])); + else + ia64_expand_load_address (operands[0], operands[1]); DONE; } - if (! reload_in_progress && ! reload_completed - && ! ia64_move_ok (operands[0], operands[1])) - operands[1] = force_reg (DImode, operands[1]); }") ;; Errata 72 workaround. @@ -407,6 +414,22 @@ [(set_attr "type" "A,A,L,M,M,F,I,I,M,M") (set_attr "predicable" "no")]) +;; This is used during early compilation to delay the decision on +;; how to refer to a variable as long as possible. This is especially +;; important between initial rtl generation and optimization for +;; deferred functions, since we may acquire additional information +;; on the variables used in the meantime. + +(define_insn_and_split "movdi_symbolic" + [(set (match_operand:DI 0 "register_operand" "=r") + (match_operand:DI 1 "symbolic_operand" "s")) + (use (reg:DI 1))] + "" + "* abort ();" + "" + [(const_int 0)] + "ia64_expand_load_address (operands[0], operands[1]); DONE;") + (define_insn "*movdi_internal_astep" [(set (match_operand:DI 0 "destination_operand" "=r,r,r,r, m, r,*f,*f,*f, Q, r,*b*e, r,*d, r,*c") |