On 1/11/25 2:20 PM, Jakub Jelinek wrote:
On Sat, Jan 11, 2025 at 01:52:59AM -0800, Andrew Pinski wrote:
The problem is for inline-asm goto, the outer rtl insn type
is a jump_insn and get_attr_length does not handle ASM specially
unlike if the outer rtl insn type was just insn.
This fixes the issue by adding support for both CALL_INSN and JUMP_INSN
with asm.
OK? Bootstrapped and tested on x86_64-linux-gnu.
PR middle-end/118411
gcc/ChangeLog:
* final.cc (get_attr_length_1): Handle asm for CALL_INSN
and JUMP_INSNs.
Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
---
gcc/final.cc | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/gcc/final.cc b/gcc/final.cc
index 19c5d390c78..12c6eb0ac09 100644
--- a/gcc/final.cc
+++ b/gcc/final.cc
@@ -363,7 +363,11 @@ get_attr_length_1 (rtx_insn *insn, int (*fallback_fn)
(rtx_insn *))
case CALL_INSN:
case JUMP_INSN:
- length = fallback_fn (insn);
+ body = PATTERN (insn);
+ if (GET_CODE (body) == ASM_INPUT || asm_noperands (body) >= 0)
+ length = asm_insn_count (body) * fallback_fn (insn);
+ else
+ length = fallback_fn (insn);
break;
A CALL_INSN can't be ever an inline asm, and ASM_INPUT (i.e. asm
("something");) can't be even JUMP_INSN.
So, shouldn't this be instead
case JUMP_INSN:
if (asm_noperands (body) >= 0)
{
length = asm_insn_count (body) * fallback_fn (insn);
break;
}
/* FALLTHRU */
case CALL_INSN:
length = fallback_fn (insn);
break;
?
Yea, but we never thought we'd have JUMP_INSNs as ASMs either.... I
don't think Andrew's approach will cause any problems and does future
proof this tiny bit of code.
jeff