aboutsummaryrefslogtreecommitdiff
path: root/gcc/c/c-parser.cc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2023-12-11 19:43:38 +0000
committerRichard Sandiford <richard.sandiford@arm.com>2023-12-11 19:43:38 +0000
commita14d247f339454ef9068d24e64eeaeef282fec95 (patch)
tree719a2e859b48783c134e5c406acceee1d5888b80 /gcc/c/c-parser.cc
parent074c6f15f7a28c620c756f18c2a310961de00539 (diff)
downloadgcc-a14d247f339454ef9068d24e64eeaeef282fec95.zip
gcc-a14d247f339454ef9068d24e64eeaeef282fec95.tar.gz
gcc-a14d247f339454ef9068d24e64eeaeef282fec95.tar.bz2
Treat "p" in asms as addressing VOIDmode
check_asm_operands was inconsistent about how it handled "p" after RA compared to before RA. Before RA it tested the address with a void (unknown) memory mode: case CT_ADDRESS: /* Every address operand can be reloaded to fit. */ result = result || address_operand (op, VOIDmode); break; After RA it deferred to constrain_operands, which used the mode of the operand: if ((GET_MODE (op) == VOIDmode || SCALAR_INT_MODE_P (GET_MODE (op))) && (strict <= 0 || (strict_memory_address_p (recog_data.operand_mode[opno], op)))) win = true; Using the mode of the operand is necessary for special predicates, where it is used to give the memory mode. But for asms, the operand mode is simply the mode of the address itself (so DImode on 64-bit targets), which doesn't say anything about the addressed memory. This patch uses VOIDmode for asms but continues to use the operand mode for .md insns. It's needed to avoid a regression in the testcase with the late-combine pass. Fixing this made me realise that recog_level2 was doing duplicate work for asms after RA. gcc/ * recog.cc (constrain_operands): Pass VOIDmode to strict_memory_address_p for 'p' constraints in asms. * rtl-ssa/changes.cc (recog_level2): Skip redundant constrain_operands for asms. gcc/testsuite/ * gcc.target/aarch64/prfm_imm_offset_2.c: New test.
Diffstat (limited to 'gcc/c/c-parser.cc')
0 files changed, 0 insertions, 0 deletions