This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch][DF] fix df_find_def and df_find_use
- From: Steven Bosscher <stevenb dot gcc at gmail dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Paolo Bonzini <bonzini at gnu dot org>
- Date: Wed, 10 Apr 2013 21:33:54 +0200
- Subject: [patch][DF] fix df_find_def and df_find_use
Hello,
df_find_def and df_find_use do not work properly for hard registers
because rtx_equal_p returns false for the case where
REGNO(x)==REGNO(y) but the modes are different. This happened as
follows in my case:
Breakpoint 9, df_reg_used (insn=0x3fffb6083c50, reg=0x3fffb5eb72e0) at
../../trunk/gcc/df-core.c:1856
1856 return df_find_use (insn, reg) != NULL;
(gdb) p debug_rtx(reg)
(reg:CCX 100 %icc)
$37 = void
(gdb) p debug_rtx(insn)
(jump_insn 34 33 35 3 (set (pc)
(if_then_else (le (reg:CCX 100 %icc)
(const_int 0 [0]))
(label_ref 44)
(pc))) t.c:25 48 {*normal_branch}
(expr_list:REG_DEAD (reg:CCX 100 %icc)
(expr_list:REG_BR_PROB (const_int 3900 [0xf3c])
(nil)))
-> 44)
$38 = void
(gdb) step
df_find_use (insn=0x3fffb6083c50, reg=0x3fffb5eb72e0) at
../../trunk/gcc/df-core.c:1829
...
1837 if (rtx_equal_p (DF_REF_REAL_REG (use), reg))
(gdb) p debug_rtx(reg)
(reg:CCX 100 %icc)
$39 = void
(gdb) p debug_rtx(DF_REF_REAL_REG(use))
(reg:CC 100 %icc)
$40 = void
(gdb) p rtx_equal_p (DF_REF_REAL_REG (use), reg)
$41 = 0
I think we should just compare REGNO instead of going through rtx_equal_p.
Bootstrapped&tested on x86_64-unknown-linux-gnu.
OK for trunk?
Ciao!
Steven
* df-core.c (df_find_def): Compare register numbers.
(df_find_use): Compare register numbers.
Index: df-core.c
===================================================================
--- df-core.c (revision 197610)
+++ df-core.c (working copy)
@@ -1800,7 +1800,7 @@ df_find_def (rtx insn, rtx reg)
for (def_rec = DF_INSN_UID_DEFS (uid); *def_rec; def_rec++)
{
df_ref def = *def_rec;
- if (rtx_equal_p (DF_REF_REAL_REG (def), reg))
+ if (DF_REF_REGNO (def) == REGNO (reg))
return def;
}
@@ -1834,14 +1834,14 @@ df_find_use (rtx insn, rtx reg)
for (use_rec = DF_INSN_UID_USES (uid); *use_rec; use_rec++)
{
df_ref use = *use_rec;
- if (rtx_equal_p (DF_REF_REAL_REG (use), reg))
+ if (DF_REF_REGNO (use) == REGNO (reg))
return use;
}
if (df->changeable_flags & DF_EQ_NOTES)
for (use_rec = DF_INSN_UID_EQ_USES (uid); *use_rec; use_rec++)
{
df_ref use = *use_rec;
- if (rtx_equal_p (DF_REF_REAL_REG (use), reg))
+ if (DF_REF_REGNO (use) == REGNO (reg))
return use;
}
return NULL;