diff options
author | bernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-05-03 09:35:42 +0000 |
---|---|---|
committer | bernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-05-03 09:35:42 +0000 |
commit | 69105acc9c655b95feb2d6ebd6cec7211343b719 (patch) | |
tree | db4f856ef821d7dc564edeb431dc0da7bf076b30 /gcc/df-scan.c | |
parent | 9ab8df54d1d38d1f5c82995147927ddc0a85e01f (diff) | |
download | gcc-69105acc9c655b95feb2d6ebd6cec7211343b719.tar.gz |
Fix PR44281, bad RA with global regs.
PR rtl-optimization/44281
* hard-reg-set.h (struct target_hard_regs): New field
x_fixed_nonglobal_reg_set.
(fixed_nonglobal_reg_set): New macro.
* reginfo.c (init_reg_sets_1): Initialize it.
* ira.c (setup_alloc_regs): Use fixed_nonglobal_reg_set instead
of fixed_reg_set.
* df-scan.c (df_insn_refs_collect): Asms may reference global regs.
testsuite/
PR rtl-optimization/44281
* gcc.target/i386/pr44281.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@235809 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/df-scan.c')
-rw-r--r-- | gcc/df-scan.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/gcc/df-scan.c b/gcc/df-scan.c index e6d01d60082..19d8e0f0eeb 100644 --- a/gcc/df-scan.c +++ b/gcc/df-scan.c @@ -3223,11 +3223,22 @@ df_insn_refs_collect (struct df_collection_rec *collection_rec, } } + int flags = (is_cond_exec) ? DF_REF_CONDITIONAL : 0; /* For CALL_INSNs, first record DF_REF_BASE register defs, as well as uses from CALL_INSN_FUNCTION_USAGE. */ if (CALL_P (insn_info->insn)) - df_get_call_refs (collection_rec, bb, insn_info, - (is_cond_exec) ? DF_REF_CONDITIONAL : 0); + df_get_call_refs (collection_rec, bb, insn_info, flags); + + if (asm_noperands (PATTERN (insn_info->insn)) >= 0) + for (unsigned i = 0; i < FIRST_PSEUDO_REGISTER; i++) + if (global_regs[i]) + { + /* As with calls, asm statements reference all global regs. */ + df_ref_record (DF_REF_BASE, collection_rec, regno_reg_rtx[i], + NULL, bb, insn_info, DF_REF_REG_USE, flags); + df_ref_record (DF_REF_BASE, collection_rec, regno_reg_rtx[i], + NULL, bb, insn_info, DF_REF_REG_DEF, flags); + } /* Record other defs. These should be mostly for DF_REF_REGULAR, so that a qsort on the defs is unnecessary in most cases. */ |