Vineet Gupta <vine...@rivosinc.com> writes: > On 6/3/25 10:11, Richard Sandiford wrote: >> Vineet Gupta <vine...@rivosinc.com> writes: >>> On 6/3/25 08:24, Richard Sandiford wrote: >>>> I think the issue is that: >>>> >>>> (insn 9 8 27 2 (parallel [ >>>> (asm_operands/v ("fsrm %0") ("") 0 [ >>>> (reg:SI 15 a5 [139]) >>>> ] >>>> [ >>>> (asm_input:SI ("r") frm-run-1.c:33) >>>> ] >>>> [] frm-run-1.c:33) >>>> (clobber (reg:V4096QI 69 frm)) >>>> ]) "frm-run-1.c":33:3 -1 >>>> (nil)) >>>> >>>> is seen as invalidating FRM and so: >>>> >>>> (insn 27 9 28 2 (set (reg:SI 15 a5 [144]) >>>> (reg:SI 69 frm)) "frm-run-1.c":43:1 2829 {frrmsi} >>>> (nil)) >>>> >>>> is seen as an uninitialised read. I suppose clobbers in inline asms >>>> need to be treated as real definitions rather than just kills. >>> In general or specifically inside of late_combine ? >> We can start with the routines that rtl-ssa uses for its dataflow analysis. >> Does the patch below help? > > Sorry, it doesn't. It seems the new code is not getting hit because @has_asm > is > false. > I tried a little hack to force it for my use case but it doesn't doesn't hit > the > new code. > > @@ -2236,7 +2236,7 @@ rtx_properties::try_to_add_src (const_rtx x, unsigned > int > flags) > } > else if (code == UNSPEC_VOLATILE) > has_volatile_refs = true; > - else if (code == ASM_INPUT || code == ASM_OPERANDS) > + else if (code == ASM_INPUT || code == ASM_OPERANDS || code == CLOBBER) > > Next I tried another mindless hack > > @@ -2295,7 +2295,7 @@ rtx_properties::try_to_add_pattern (const_rtx pat) > case CLOBBER: > { > rtx x = XEXP (pat, 0); > - if (has_asm && asm_clobber_is_read_modify_write_p (x)) > + if (asm_clobber_is_read_modify_write_p (x)) > > Now the new code hits, but the final outcome is still the same, late_combine2 > is > still eliminating those.
Are you sure? Removing the "has_asm &&" works for me on your frm-mode-switch/upstream-v2 branch. But I think the non-hacky fix for the has_asm problem is the one below. Richard rtx_properties::try_to_add_pattern had a special case for ASM_OPERANDS. But this was a mistake, since: (a) it subverted the handling of ASM_OPERANDS in try_to_add_src. (b) it meant that there was an unnecessary divergence between the handling of asms with output operands and those without. I think this was probably something that I added early on, based on patterns elsewhere in the file, and didn't revisit later when the patch evolved. gcc/ * rtlanal.cc (rtx_properties::try_to_add_pattern): Remove special handling of ASM_OPERANDS and defer to try_to_add_src instead. --- gcc/rtlanal.cc | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/gcc/rtlanal.cc b/gcc/rtlanal.cc index 239d6691c4c..91cefae69be 100644 --- a/gcc/rtlanal.cc +++ b/gcc/rtlanal.cc @@ -2256,11 +2256,6 @@ rtx_properties::try_to_add_pattern (const_rtx pat) break; } - case ASM_OPERANDS: - for (int i = 0, len = ASM_OPERANDS_INPUT_LENGTH (pat); i < len; ++i) - try_to_add_src (ASM_OPERANDS_INPUT (pat, i)); - break; - case CLOBBER: try_to_add_dest (XEXP (pat, 0), rtx_obj_flags::IS_CLOBBER); break; @@ -2274,6 +2269,8 @@ rtx_properties::try_to_add_pattern (const_rtx pat) /* All the other possibilities never store and can use a normal rtx walk. This includes: + - ASM_INPUT + - ASM_OPERANDS - USE - TRAP_IF - PREFETCH -- 2.43.0