aboutsummaryrefslogtreecommitdiff
path: root/gcc/df-scan.c
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@redhat.com>2016-05-03 09:35:42 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2016-05-03 09:35:42 +0000
commitf80041efb991e4326971dea550157192f912d9a4 (patch)
treedb4f856ef821d7dc564edeb431dc0da7bf076b30 /gcc/df-scan.c
parent1cfcd39eee915a7582adc113fa6e7faac8b943e4 (diff)
downloadgcc-f80041efb991e4326971dea550157192f912d9a4.zip
gcc-f80041efb991e4326971dea550157192f912d9a4.tar.gz
gcc-f80041efb991e4326971dea550157192f912d9a4.tar.bz2
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. From-SVN: r235809
Diffstat (limited to 'gcc/df-scan.c')
-rw-r--r--gcc/df-scan.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/gcc/df-scan.c b/gcc/df-scan.c
index e6d01d6..19d8e0f 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. */