https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70478
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |ra Status|UNCONFIRMED |NEW Last reconfirmed| |2016-03-31 Ever confirmed|0 |1 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- It seems to somehow "optimize" with regard to the and op being unsigned char and thus all upper bits being zero and only the lower ones need to be computed? Before RA (insn 7 4 8 2 (set (reg:SI 66 [ *b_4(D)+-3 ]) (zero_extend:SI (mem:QI (reg:DI 3 %r3 [ b ]) [0 *b_4(D)+0 S1 A8]))) t.c:3 1209 {*zero_extendqisi2_extimm} (expr_list:REG_DEAD (reg:DI 3 %r3 [ b ]) (nil))) (insn 8 7 11 2 (parallel [ (set (mem:SI (reg:DI 2 %r2 [ a ]) [1 *a_2(D)+0 S4 A32]) (and:SI (mem:SI (reg:DI 2 %r2 [ a ]) [1 *a_2(D)+0 S4 A32]) (reg:SI 66 [ *b_4(D)+-3 ]))) (clobber (reg:CC 33 %cc)) ]) t.c:3 1473 {*andsi3_zarch} (expr_list:REG_DEAD (reg:SI 66 [ *b_4(D)+-3 ]) (expr_list:REG_DEAD (reg:DI 2 %r2 [ a ]) (expr_list:REG_UNUSED (reg:CC 33 %cc) (nil))))) after (insn 7 4 8 2 (set (reg:SI 66 [ *b_4(D)+-3 ]) (zero_extend:SI (mem:QI (reg:DI 3 %r3 [ b ]) [0 *b_4(D)+0 S1 A8]))) t.c:3 1209 {*zero_extendqisi2_extimm} (expr_list:REG_DEAD (reg:DI 3 %r3 [ b ]) (nil))) (insn 8 7 11 2 (parallel [ (set (mem:SI (reg:DI 2 %r2 [ a ]) [1 *a_2(D)+0 S4 A32]) (and:SI (mem:SI (reg:DI 2 %r2 [ a ]) [1 *a_2(D)+0 S4 A32]) (reg:SI 66 [ *b_4(D)+-3 ]))) (clobber (reg:CC 33 %cc)) ]) t.c:3 1473 {*andsi3_zarch} (expr_list:REG_DEAD (reg:SI 66 [ *b_4(D)+-3 ]) (expr_list:REG_DEAD (reg:DI 2 %r2 [ a ]) (expr_list:REG_UNUSED (reg:CC 33 %cc) (nil))))) but then LRA chooses to spill while reload is happy with the above.