aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>2000-08-14 13:28:11 -0700
committerRichard Henderson <rth@gcc.gnu.org>2000-08-14 13:28:11 -0700
commit9a89adb8c76cc64dab9bf62d1cdc08322f883604 (patch)
treead82a4c0f4c17b838f1008f28729361acbb7aa4d /gcc/config
parent00e149c78fc099a8f3485f4ea81995e2c7e65733 (diff)
downloadgcc-9a89adb8c76cc64dab9bf62d1cdc08322f883604.zip
gcc-9a89adb8c76cc64dab9bf62d1cdc08322f883604.tar.gz
gcc-9a89adb8c76cc64dab9bf62d1cdc08322f883604.tar.bz2
ia64.md (movdi): Delay calling ia64_expand_load_address.
* config/ia64/ia64.md (movdi): Delay calling ia64_expand_load_address. (movdi_symbolic): New. From-SVN: r35685
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/ia64/ia64.md31
1 files changed, 27 insertions, 4 deletions
diff --git a/gcc/config/ia64/ia64.md b/gcc/config/ia64/ia64.md
index 6a30393..4a68623 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")