http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50663
Bug #: 50663 Summary: conditional propagation missed in cprop.c pass Classification: Unclassified Product: gcc Version: 4.7.0 Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: rtl-optimization AssignedTo: unassig...@gcc.gnu.org ReportedBy: amker.ch...@gmail.com For following test case: extern int g; int main(int a, int b) { if (a == 1) { b = a; } g = b; return 0; } piece of dump file for cprop1 pass is like: (insn 8 4 9 2 (set (reg:CC 24 cc) (compare:CC (reg/v:SI 135 [ a ]) (const_int 1 [0x1]))) test.c:4 200 {*arm_cmpsi_insn} (nil)) (jump_insn 9 8 10 2 (set (pc) (if_then_else (ne (reg:CC 24 cc) (const_int 0 [0])) (label_ref 11) (pc))) test.c:4 212 {*arm_cond_branch} (expr_list:REG_DEAD (reg:CC 24 cc) (expr_list:REG_BR_PROB (const_int 6218 [0x184a]) (nil))) -> 11) (note 10 9 5 3 [bb 3] NOTE_INSN_BASIC_BLOCK) (insn 5 10 11 3 (set (reg/v:SI 136 [ b ]) (reg/v:SI 135 [ a ])) test.c:4 696 {*thumb2_movsi_insn} (expr_list:REG_DEAD (reg/v:SI 135 [ a ]) (expr_list:REG_EQUAL (const_int 1 [0x1]) (nil)))) The r135 in insn_5 should handled by conditional propagation, like: (note 10 9 5 3 [bb 3] NOTE_INSN_BASIC_BLOCK) (insn 5 10 11 3 (set (reg/v:SI 136 [ b ]) (const_int 1 [0x1])) test.c:4 709 {*thumb2_movsi_insn} (expr_list:REG_DEAD (reg/v:SI 135 [ a ]) (expr_list:REG_EQUAL (const_int 1 [0x1]) (nil)))) Seems cprop misses the conditional propagation for the branch basic block. FYI, I compiled the test case with command: ./arm-none-eabi-gcc -march=armv7-m -mthumb -O2 -S test.c -o test.S -da The gcc is comfigured for arm-none-eabi and it's on trunk.