diff options
author | Jeff Law <jlaw@ventanamicro.com> | 2023-11-19 11:56:57 -0700 |
---|---|---|
committer | Jeff Law <jlaw@ventanamicro.com> | 2023-11-19 11:58:54 -0700 |
commit | 07da9b7f13c92a21d12172a9df85ad762591b998 (patch) | |
tree | 5e5288b1454a27a1b1b822342894ba5312e03991 /gcc/cp/mangle.cc | |
parent | 06e7cc79fd3b1b8417b21b5fff589b885ecaa948 (diff) | |
download | gcc-07da9b7f13c92a21d12172a9df85ad762591b998.zip gcc-07da9b7f13c92a21d12172a9df85ad762591b998.tar.gz gcc-07da9b7f13c92a21d12172a9df85ad762591b998.tar.bz2 |
[committed] Fix missing mode on a few unspec/unspec_volatile operands
This is fix for a minor problem Jivan and I found while testing the ext-dce work originally from Joern.
The ext-dce pass will transform zero/sign extensions into subreg accesses when
the upper bits are actually unused. So it's more likely with the ext-dce work
to get a sequence like this prior to combine:
>
>> (insn 10 9 11 2 (set (reg:SI 144)
>> (unspec_volatile [
>> (const_int 0 [0])
>> ] UNSPECV_FRFLAGS)) "j.c":11:3 discrim 1 362 {riscv_frflags}
>> (nil))
>> (insn 11 10 55 2 (set (reg:DI 140 [ _12 ])
>> (subreg:DI (reg:SI 144) 0)) "j.c":11:3 discrim 1 206 {*movdi_64bit}
>> (expr_list:REG_DEAD (reg:SI 144)
>> (nil)))
When we try to combine insn 10->11 we'll ultimately call simplify_subreg with
something like
(subreg:DI (unspec_volatile [...]) 0)
Note the lack of a mode on the unspec_volatile. That in turn will cause
simplify_subreg to trigger an assertion.
The modeless unspec is generated by the RISC-V backend and the more I've
pondered this issue over the last few days the more I'm convinced it's a
backend bug. Basically if the LHS of the set has a mode, then the RHS of the
set should have a mode as well.
I've audited the various backends and only found a few problems which are fixed
by this patch. I've tested the relevant ports in my tester. c6x, sh, mips and
s390[x].
There are other patterns that are potentially problematical in various ports.
They have a REG destination and an UNSPEC source, but the REG has no mode in
the pattern. Since it wasn't clear what mode to give the UNSPEC, I left those
alone.
gcc/
* config/c6x/c6x.md (mvilc): Add mode to UNSPEC source.
* config/mips/mips.md (rdhwr_synci_step_<mode>): Likewise.
* config/riscv/riscv.md (riscv_frcsr, riscv_frflags): Likewise.
* config/s390/s390.md (@split_stack_call<mode>): Likewise.
(@split_stack_cond_call<mode>): Likewise.
* config/sh/sh.md (sp_switch_1): Likewise.
Diffstat (limited to 'gcc/cp/mangle.cc')
0 files changed, 0 insertions, 0 deletions