https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91102
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Target| |aarch64-linux Priority|P3 |P2 Status|UNCONFIRMED |NEW Last reconfirmed| |2019-07-06 CC| |segher at gcc dot gnu.org, | |sje at gcc dot gnu.org, | |vmakarov at gcc dot gnu.org Target Milestone|--- |9.2 Ever confirmed|0 |1 --- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Before combine we have: (insn 12 11 14 3 (set (zero_extract:DI (reg/v:DI 95 [ c ]) (const_int 32 [0x20]) (const_int 32 [0x20])) (reg:DI 100)) "rh1727453.i":18:12 782 {*insv_regdi} (expr_list:REG_DEAD (reg:DI 100) (nil))) (insn 14 12 15 3 (set (reg/v:DI 1 x1 [ e ]) (reg:DI 92 [ b$h ])) "rh1727453.i":4:17 47 {*movdi_aarch64} (expr_list:REG_DEAD (reg:DI 92 [ b$h ]) (nil))) (insn 15 14 16 3 (set (reg/v:DI 2 x2 [ f ]) (reg/v:DI 95 [ c ])) "rh1727453.i":5:17 47 {*movdi_aarch64} (expr_list:REG_DEAD (reg/v:DI 95 [ c ]) (nil))) Combine makes it into: (insn 14 12 15 3 (set (reg/v:DI 1 x1 [ e ]) (reg:DI 92 [ b$h ])) "rh1727453.i":4:17 47 {*movdi_aarch64} (nil)) (insn 15 14 16 3 (set (reg/v:DI 2 x2 [ f ]) (ior:DI (and:DI (reg:DI 92 [ b$h ]) (const_int 4294967295 [0xffffffff])) (ashift:DI (subreg:DI (reg:SI 99) 0) (const_int 32 [0x20])))) "rh1727453.i":5:17 794 {*aarch64_bfidi4_noand} (expr_list:REG_DEAD (reg:DI 92 [ b$h ]) (expr_list:REG_DEAD (reg:SI 99) (nil)))) (note the hard reg output, but still no input). But then something during IRA decides to replace that reg:DI 92 with reg:DI 1 x1: (insn 14 12 15 3 (set (reg/v:DI 1 x1 [ e ]) (reg:DI 92 [ b$h ])) "rh1727453.i":4:17 47 {*movdi_aarch64} (expr_list:REG_DEAD (reg:DI 92 [ b$h ]) (nil))) (insn 15 14 16 3 (set (reg/v:DI 2 x2 [ f ]) (ior:DI (and:DI (reg/v:DI 1 x1 [ e ]) (const_int 4294967295 [0xffffffff])) (ashift:DI (subreg:DI (reg:SI 99) 0) (const_int 32 [0x20])))) "rh1727453.i":5:17 794 {*aarch64_bfidi4_noand} (expr_list:REG_DEAD (reg:SI 99) (nil))) And LRA can't deal with that, because the pattern is: (define_insn ("*aarch64_bfidi4_noand") [ (set (match_operand:DI 0 ("register_operand") ("=r")) (ior:DI (and:DI (match_operand:DI 1 ("register_operand") ("0")) (match_operand:DI 2 ("const_int_operand") ("n"))) (ashift:DI (match_operand:DI 3 ("register_operand") ("r")) (match_operand:DI 4 ("aarch64_simd_shift_imm_di") ("n"))))) ] ("aarch64_masks_and_shift_for_bfi_p (DImode, UINTVAL (operands[2]), UINTVAL (operands[4]), HOST_WIDE_INT_M1U << UINTVAL (operands[4]) )") ("*{ operands[5] = GEN_INT (GET_MODE_BITSIZE (DImode) - UINTVAL (operands[4])); return "bfi\t%x0, %x3, %4, %5"; }") [ (set_attr ("type") ("bfm")) ]) and thus wants LRA to reload the operand 1 into the same register as operand 0. I think "register_operand" "=r" and "register_operand" "0" operands are extremely common in all backends, so I don't see an obvious bug on the aarch64 backend size here. Vlad, could you please have a look?