On 6/4/25 04:45, 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.
Sorry yes indeed the hack worked, I must have mixed up the dumpbase when generating different outputs. > But I think the non-hacky fix for the has_asm problem is the one below. Thx, yes this works for my testcase as well. Will you be pushing these 2 changes, the reference PR (for discussions at least) could be 120245 and/or 120404. Thx, -Vineet > 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