aboutsummaryrefslogtreecommitdiff
path: root/libjava/classpath/vm/reference/gnu/java
diff options
context:
space:
mode:
authorStefan Schulze Frielinghaus <stefansf@gcc.gnu.org>2026-02-07 10:21:02 +0100
committerStefan Schulze Frielinghaus <stefansf@gcc.gnu.org>2026-02-07 10:21:02 +0100
commit16cbe70b95227a119fbd146f2947f5e162bbdbd4 (patch)
tree8855313489569c73e1a2f04e58b86faaadd6a94b /libjava/classpath/vm/reference/gnu/java
parent30886aeca75076bfd50b0fff8d76942603bee763 (diff)
downloadgcc-16cbe70b95227a119fbd146f2947f5e162bbdbd4.zip
gcc-16cbe70b95227a119fbd146f2947f5e162bbdbd4.tar.gz
gcc-16cbe70b95227a119fbd146f2947f5e162bbdbd4.tar.bz2
cse: Take single register constraints into account
This fixes t.c:17:3: error: 'asm' operand has impossible constraints or there are not enough registers 17 | __asm__ ("" : "=f" (a), "={fr2}" (e) : "{fr1}" (d)); | ^~~~~~~ on powerpc64le-unknown-linux-gnu for the attached test. Prior cse1 we have (insn 2 4 3 2 (set (reg/v:TF 120 [ c ]) (reg:TF 33 1 [ c ])) "t.c":14:26 614 {*movtf_64bit_dm} (nil)) ... (insn 10 9 6 2 (parallel [ (set (reg:DF 121) (asm_operands:DF ("") ("=f") 0 [ (reg:TF 124) ] [ (asm_input:TF ("{fr1}") t.c:17) ] [] t.c:17)) (set (reg:DF 123 [ e ]) (asm_operands:DF ("") ("={fr2}") 1 [ (reg:TF 124) ] [ (asm_input:TF ("{fr1}") t.c:17) ] [] t.c:17)) (clobber (reg:SI 98 ca)) ]) "t.c":17:3 -1 (nil)) ... (insn 12 11 13 2 (set (reg:TF 33 1) (reg/v:TF 120 [ c ])) "t.c":18:12 614 {*movtf_64bit_dm} (nil)) During cse1, in insn 12 pseudo 120 is substituted with hard register 33 rendering the resulting insn trivial which is why the insn gets removed afterwards. Since hard register 33 has a use after insn 12, the register is live before and after insn 10. This leaves us with the non-trivial problem, during LRA, to also assign hard register 33 to pseudo 124 which is coming from the constraint of insn 10. Since hard registers are not tracked, except for liveness, this cannot be solved by reloads which is why we end up with an error. Therefore, treat single register constraints as clobbers of the respective hard registers. For the sake of symmetry this should also be done for constraints associated a single register class. However, since we are in stage 4, there is no open PR, and I haven't done any extensive testing for single register classes, I'm skipping this for the moment. Once we are back in stage 1, something along the lines could be added: else { enum reg_class cl = reg_class_for_constraint (lookup_constraint (p)); if (cl == NO_REGS) continue; machine_mode mode = recog_data.operand_mode[nop]; int regno = ira_class_singleton[cl][mode]; if (regno >= 0) invalidate_reg (gen_rtx_REG (mode, regno)); } gcc/ChangeLog: * cse.cc (invalidate_from_sets_and_clobbers): Consider any hard register referred to by any single register constraint potentially being clobbered. gcc/testsuite/ChangeLog: * gcc.target/powerpc/asm-hard-reg-2.c: New test.
Diffstat (limited to 'libjava/classpath/vm/reference/gnu/java')
0 files changed, 0 insertions, 0 deletions