https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96264
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |ra CC| |vmakarov at gcc dot gnu.org --- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> --- And on the current trunk I see similar thing, looking for "ca)" in *.ira and *.reload dumps shows: (insn 30 750 32 2 (parallel [ (set (reg:DI 247) (ashiftrt:DI (reg:DI 119 [ _15 ]) (const_int 63 [0x3f]))) (clobber (reg:DI 98 ca)) ]) "pr96264.c":12:20 281 {ashrdi3} (expr_list:REG_UNUSED (reg:DI 98 ca) (nil))) (insn 32 30 87 2 (parallel [ (set (reg:DI 540 [ _22 ]) (minus:DI (reg:DI 538 [ _19 ]) (reg:DI 119 [ _15 ]))) (set (reg:DI 98 ca) (leu:DI (reg:DI 119 [ _15 ]) (reg:DI 538 [ _19 ]))) ]) "pr96264.c":12:12 104 {subfdi3_carry} (expr_list:REG_DEAD (reg:DI 538 [ _19 ]) (nil))) (insn 87 32 86 2 (parallel [ (set (reg:HI 277) (vec_select:HI (reg:V8HI 129 [ _36 ]) (parallel [ (const_int 4 [0x4]) ]))) (clobber (reg:V8HI 2668)) ]) "pr96264.c":13:10 1365 {*vsx_extract_v8hi_p8} (expr_list:REG_UNUSED (reg:V8HI 2668) (nil))) (insn 86 87 33 2 (set (reg:V8HI 135 [ _42 ]) (plus:V8HI (reg:V8HI 259 [ _41 ]) (reg:V8HI 273))) "pr96264.c":13:15 1614 {addv8hi3} (expr_list:REG_DEAD (reg:V8HI 259 [ _41 ]) (nil))) (insn 33 86 751 2 (parallel [ (set (reg:DI 541 [ _22+8 ]) (plus:DI (plus:DI (not:DI (reg:DI 247)) (reg:DI 98 ca)) (reg:DI 539 [ _19+8 ]))) (clobber (reg:DI 98 ca)) ]) "pr96264.c":12:12 108 {*subfdi3_carry_in_internal} (expr_list:REG_DEAD (reg:DI 539 [ _19+8 ]) (expr_list:REG_DEAD (reg:DI 98 ca) (expr_list:REG_UNUSED (reg:DI 98 ca) (nil))))) ... (insn 34 216 763 2 (parallel [ (set (reg:DI 544 [ _26 ]) (minus:DI (reg:DI 542 [ _23 ]) (reg:DI 119 [ _15 ]))) (set (reg:DI 98 ca) (leu:DI (reg:DI 119 [ _15 ]) (reg:DI 542 [ _23 ]))) ]) "pr96264.c":12:12 104 {subfdi3_carry} (expr_list:REG_DEAD (reg:DI 542 [ _23 ]) (nil))) (insn 763 34 221 2 (set (reg:DI 543 [ _23+8 ]) (mem/j/c:DI (plus:DI (reg/f:DI 244) (const_int 8 [0x8])) [1 BIT_FIELD_REF <f, 128, 128>+8 S8 A64])) "pr96264.c":12:12 636 {*movdi_internal64} (expr_list:REG_DEAD (reg/f:DI 244) (nil))) (insn 221 763 768 2 (set (reg:DI 189 [ _96 ]) (zero_extend:DI (subreg:HI (reg:SI 384) 0))) "pr96264.c":13:10 11 {zero_extendhidi2} (expr_list:REG_DEAD (reg:SI 384) (nil))) (insn 768 221 35 2 (parallel [ (set (mem/c:DI (plus:DI (reg/f:DI 110 sfp) (const_int 352 [0x160])) [1 S8 A128]) (reg:DI 544 [ _26 ])) (set (reg/f:DI 525) (plus:DI (reg/f:DI 110 sfp) (const_int 352 [0x160]))) ]) "pr96264.c":12:12 644 {movdi_di_update} (expr_list:REG_DEAD (reg:DI 544 [ _26 ]) (nil))) (insn 35 768 226 2 (parallel [ (set (reg:DI 545 [ _26+8 ]) (plus:DI (plus:DI (not:DI (reg:DI 247)) (reg:DI 98 ca)) (reg:DI 543 [ _23+8 ]))) (clobber (reg:DI 98 ca)) ]) "pr96264.c":12:12 108 {*subfdi3_carry_in_internal} (expr_list:REG_DEAD (reg:DI 543 [ _23+8 ]) (expr_list:REG_DEAD (reg:DI 98 ca) (expr_list:REG_UNUSED (reg:DI 98 ca) (expr_list:REG_EQUIV (mem/c:DI (plus:DI (reg/f:DI 525) (const_int 8 [0x8])) [1 S8 A64]) (nil)))))) ... (insn 36 141 761 2 (parallel [ (set (reg:DI 548 [ _30 ]) (minus:DI (reg:DI 546 [ _27 ]) (reg:DI 119 [ _15 ]))) (set (reg:DI 98 ca) (leu:DI (reg:DI 119 [ _15 ]) (reg:DI 546 [ _27 ]))) ]) "pr96264.c":12:12 104 {subfdi3_carry} (expr_list:REG_DEAD (reg:DI 546 [ _27 ]) (nil))) (insn 761 36 146 2 (set (reg:DI 547 [ _27+8 ]) (mem/j/c:DI (plus:DI (reg/f:DI 242) (const_int 8 [0x8])) [1 BIT_FIELD_REF <f, 128, 256>+8 S8 A64])) "pr96264.c":12:12 636 {*movdi_internal64} (expr_list:REG_DEAD (reg/f:DI 242) (nil))) (insn 146 761 770 2 (set (reg:DI 159 [ _66 ]) (zero_extend:DI (subreg:HI (reg:SI 324) 0))) "pr96264.c":13:10 11 {zero_extendhidi2} (expr_list:REG_DEAD (reg:SI 324) (nil))) (insn 770 146 37 2 (parallel [ (set (mem/c:DI (plus:DI (reg/f:DI 110 sfp) (const_int 368 [0x170])) [1 S8 A128]) (reg:DI 548 [ _30 ])) (set (reg/f:DI 526) (plus:DI (reg/f:DI 110 sfp) (const_int 368 [0x170]))) ]) "pr96264.c":12:12 644 {movdi_di_update} (expr_list:REG_DEAD (reg:DI 548 [ _30 ]) (nil))) (insn 37 770 151 2 (parallel [ (set (reg:DI 549 [ _30+8 ]) (plus:DI (plus:DI (not:DI (reg:DI 247)) (reg:DI 98 ca)) (reg:DI 547 [ _27+8 ]))) (clobber (reg:DI 98 ca)) ]) "pr96264.c":12:12 108 {*subfdi3_carry_in_internal} (expr_list:REG_DEAD (reg:DI 547 [ _27+8 ]) (expr_list:REG_DEAD (reg:DI 98 ca) (expr_list:REG_UNUSED (reg:DI 98 ca) (expr_list:REG_EQUIV (mem/c:DI (plus:DI (reg/f:DI 526) (const_int 8 [0x8])) [1 S8 A64]) (nil)))))) ... (insn 38 201 759 2 (parallel [ (set (reg:DI 552 [ _34 ]) (minus:DI (reg:DI 550 [ _31 ]) (reg:DI 119 [ _15 ]))) (set (reg:DI 98 ca) (leu:DI (reg:DI 119 [ _15 ]) (reg:DI 550 [ _31 ]))) ]) "pr96264.c":12:12 104 {subfdi3_carry} (expr_list:REG_DEAD (reg:DI 550 [ _31 ]) (expr_list:REG_DEAD (reg:DI 119 [ _15 ]) (nil)))) (insn 759 38 206 2 (set (reg:DI 551 [ _31+8 ]) (mem/j/c:DI (plus:DI (reg/f:DI 240) (const_int 8 [0x8])) [1 BIT_FIELD_REF <f, 128, 384>+8 S8 A64])) "pr96264.c":12:12 636 {*movdi_internal64} (expr_list:REG_DEAD (reg/f:DI 240) (nil))) (insn 206 759 96 2 (set (reg:DI 183 [ _90 ]) (zero_extend:DI (subreg:HI (reg:SI 372) 0))) "pr96264.c":13:10 11 {zero_extendhidi2} (expr_list:REG_DEAD (reg:SI 372) (nil))) (insn 96 206 101 2 (set (reg:DI 139 [ _46 ]) (zero_extend:DI (subreg:HI (reg:SI 284) 0))) "pr96264.c":13:10 11 {zero_extendhidi2} (expr_list:REG_DEAD (reg:SI 284) (nil))) (insn 101 96 772 2 (set (reg:DI 141 [ _48 ]) (zero_extend:DI (subreg:HI (reg:SI 288) 0))) "pr96264.c":13:10 11 {zero_extendhidi2} (expr_list:REG_DEAD (reg:SI 288) (nil))) (insn 772 101 39 2 (parallel [ (set (mem/c:DI (plus:DI (reg/f:DI 110 sfp) (const_int 384 [0x180])) [1 S8 A128]) (reg:DI 552 [ _34 ])) (set (reg/f:DI 527) (plus:DI (reg/f:DI 110 sfp) (const_int 384 [0x180]))) ]) "pr96264.c":12:12 644 {movdi_di_update} (expr_list:REG_DEAD (reg:DI 552 [ _34 ]) (nil))) (insn 39 772 106 2 (parallel [ (set (reg:DI 553 [ _34+8 ]) (plus:DI (plus:DI (not:DI (reg:DI 247)) (reg:DI 98 ca)) (reg:DI 551 [ _31+8 ]))) (clobber (reg:DI 98 ca)) ]) "pr96264.c":12:12 108 {*subfdi3_carry_in_internal} (expr_list:REG_DEAD (reg:DI 551 [ _31+8 ]) (expr_list:REG_DEAD (reg:DI 247) (expr_list:REG_DEAD (reg:DI 98 ca) (expr_list:REG_UNUSED (reg:DI 98 ca) (expr_list:REG_EQUIV (mem/c:DI (plus:DI (reg/f:DI 527) (const_int 8 [0x8])) [1 S8 A64]) (nil))))))) and that is all, and it looks good, the >> 63 shift clobbers ca and then there is always a pair of subfdi3_carry that sets it and subfdi3_carry_in_internal that consumes it. But in *.reload, one can see: Inserting rematerialization insn before: 3404: {r2707:DI=r119:DI>>0x3f;clobber ca:DI;} ... (insn 30 750 3289 2 (parallel [ (set (reg:DI 9 9 [247]) (ashiftrt:DI (reg:DI 8 8 [orig:119 _15 ] [119]) (const_int 63 [0x3f]))) (clobber (reg:DI 98 ca)) ]) "pr96264.c":12:20 281 {ashrdi3} (nil)) (insn 3289 30 32 2 (set (mem/c:DI (plus:DI (reg/f:DI 1 1) (const_int 544 [0x220])) [3 %sfp+544 S8 A64]) (reg:DI 9 9 [247])) "pr96264.c":12:20 636 {*movdi_internal64} (nil)) (insn 32 3289 3290 2 (parallel [ (set (reg:DI 9 9 [orig:540 _22 ] [540]) (minus:DI (reg:DI 7 7 [orig:538 _19 ] [538]) (reg:DI 8 8 [orig:119 _15 ] [119]))) (set (reg:DI 98 ca) (leu:DI (reg:DI 8 8 [orig:119 _15 ] [119]) (reg:DI 7 7 [orig:538 _19 ] [538]))) ]) "pr96264.c":12:12 104 {subfdi3_carry} (nil)) (insn 3290 32 87 2 (set (mem/c:DI (plus:DI (reg/f:DI 1 1) (const_int 528 [0x210])) [3 %sfp+528 S8 A64]) (reg:DI 9 9 [orig:540 _22 ] [540])) "pr96264.c":12:12 636 {*movdi_internal64} (nil)) (insn 87 3290 86 2 (parallel [ (set (reg:HI 31 31 [277]) (vec_select:HI (reg:V8HI 64 0 [orig:129 _36 ] [129]) (parallel [ (const_int 4 [0x4]) ]))) (clobber (reg:V8HI 74 10 [2668])) ]) "pr96264.c":13:10 1365 {*vsx_extract_v8hi_p8} (nil)) (insn 86 87 3404 2 (set (reg:V8HI 76 12 [orig:135 _42 ] [135]) (plus:V8HI (reg:V8HI 76 12 [orig:259 _41 ] [259]) (reg:V8HI 75 11 [273]))) "pr96264.c":13:15 1614 {addv8hi3} (nil)) (insn 3404 86 3292 2 (parallel [ (set (reg:DI 9 9 [247]) (ashiftrt:DI (reg:DI 8 8 [orig:119 _15 ] [119]) (const_int 63 [0x3f]))) (clobber (reg:DI 98 ca)) ]) "pr96264.c":12:12 281 {ashrdi3} (nil)) (note 3292 3404 33 2 NOTE_INSN_DELETED) (insn 33 3292 3291 2 (parallel [ (set (reg:DI 9 9 [orig:541 _22+8 ] [541]) (plus:DI (plus:DI (not:DI (reg:DI 9 9 [247])) (reg:DI 98 ca)) (reg:DI 6 6 [orig:539 _19+8 ] [539]))) (clobber (reg:DI 98 ca)) ]) "pr96264.c":12:12 108 {*subfdi3_carry_in_internal} (nil)) ... In *.ira, there was just one >> 63 before all these TImode subtractions using carry, but it seems LRA rematerialized the right shift instead of loading it from memory even when it clobbers the ca register that is live at that point.