https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82524
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |vmakarov at gcc dot gnu.org --- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- To me it looks like a LRA bug. In *.ira we have: (insn 28 27 29 2 (parallel [ (set (reg/v:SI 135 [ result ]) (ashift:SI (reg:SI 153) (const_int 16 [0x10]))) (clobber (reg:CC 17 flags)) ]) "pr82545.c":26 504 {*ashlsi3_1} (expr_list:REG_DEAD (reg:SI 153) (expr_list:REG_UNUSED (reg:CC 17 flags) (nil)))) ... (insn 38 37 39 2 (parallel [ (set (zero_extract:SI (reg/v:SI 135 [ result ]) (const_int 8 [0x8]) (const_int 8 [0x8])) (subreg:SI (plus:QI (subreg:QI (zero_extract:SI (reg:SI 159) (const_int 8 [0x8]) (const_int 8 [0x8])) 0) (subreg:QI (zero_extract:SI (reg:SI 163) (const_int 8 [0x8]) (const_int 8 [0x8])) 0)) 0)) (clobber (reg:CC 17 flags)) ]) "pr82545.c":27 235 {*addqi_ext_2} (expr_list:REG_DEAD (reg:SI 163) (expr_list:REG_DEAD (reg:SI 159) (expr_list:REG_UNUSED (reg:CC 17 flags) (nil))))) ... (insn 48 47 50 2 (set (strict_low_part (subreg:QI (reg/v:SI 135 [ result ]) 0)) (reg:QI 174)) "pr82545.c":28 97 {*movstrictqi_1} (expr_list:REG_DEAD (reg:QI 174) (nil))) (insn 50 48 56 2 (parallel [ (set (reg:SI 176) (and:SI (reg/v:SI 135 [ result ]) (const_int 16777215 [0xffffff]))) (clobber (reg:CC 17 flags)) ]) "pr82545.c":30 384 {*andsi_1} (expr_list:REG_DEAD (reg/v:SI 135 [ result ]) (expr_list:REG_UNUSED (reg:CC 17 flags) (nil)))) which at least to the RTL documentation is valid, if zero_extract or strict_low_part is on the LHS, it means the rest of the original register is preserved, just the bitfield in there is modified. But with LRA we get: (insn 28 27 29 2 (parallel [ (set (reg/v:SI 0 ax [orig:135 result ] [135]) (ashift:SI (reg:SI 0 ax [153]) (const_int 16 [0x10]))) (clobber (reg:CC 17 flags)) ]) "pr82545.c":26 504 {*ashlsi3_1} (nil)) ... (insn 66 37 38 2 (set (reg:SI 0 ax [159]) (reg:SI 3 bx [159])) "pr82545.c":27 82 {*movsi_internal} (nil)) (insn 38 66 39 2 (parallel [ (set (zero_extract:SI (reg:SI 0 ax [159]) (const_int 8 [0x8]) (const_int 8 [0x8])) (subreg:SI (plus:QI (subreg:QI (zero_extract:SI (reg:SI 0 ax [159]) (const_int 8 [0x8]) (const_int 8 [0x8])) 0) (subreg:QI (zero_extract:SI (reg:SI 1 dx [163]) (const_int 8 [0x8]) (const_int 8 [0x8])) 0)) 0)) (clobber (reg:CC 17 flags)) ]) "pr82545.c":27 235 {*addqi_ext_2} (nil)) ... (insn 48 47 50 2 (set (strict_low_part (reg:QI 0 ax [orig:135 result ] [135])) (reg:QI 1 dx [174])) "pr82545.c":28 97 {*movstrictqi_1} (nil)) (insn 50 48 56 2 (parallel [ (set (reg:SI 0 ax [176]) (and:SI (reg/v:SI 0 ax [orig:135 result ] [135]) (const_int 16777215 [0xffffff]))) (clobber (reg:CC 17 flags)) ]) "pr82545.c":30 384 {*andsi_1} (nil))