https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120050

--- Comment #6 from Xi Ruoyao <xry111 at gcc dot gnu.org> ---
Before ext-dce:

(insn 421 420 422 43 (set (reg:DI 523 [ i ])
        (sign_extend:DI (reg:SI 423 [ _144 ]))) 238 {extendsidi2}
     (expr_list:REG_DEAD (reg:SI 423 [ _144 ])
        (nil)))
(insn 440 439 441 45 (set (reg:SI 431 [ i ])
        (subreg/s/u:SI (reg:DI 523 [ i ]) 0)) "../../gcc/gcc/genhooks.cc":198:8
323 {*movsi_internal} 
     (nil))
(jump_insn 441 440 442 45 (set (pc)
        (if_then_else (eq (reg:SI 430 [ shp_91->pos ])
                (reg:SI 431 [ i ]))
            (label_ref 448)
            (pc))) "../../gcc/gcc/genhooks.cc":198:8 487 {*branch_equalitysi}
     (expr_list:REG_DEAD (reg:SI 431 [ i ])
        (expr_list:REG_DEAD (reg:SI 430 [ shp_91->pos ])
            (int_list:REG_BR_PROB 548896828 (nil))))
 -> 448)

After ext-dce, insns 421 and 440 become:

(insn 421 420 422 43 (set (reg:DI 523 [ i ]) 
        (subreg:DI (reg:SI 423 [ _144 ]) 0)) 321 {*movdi_64bit}
     (expr_list:REG_DEAD (reg:SI 423 [ _144 ])
        (nil)))
(insn 440 439 441 45 (set (reg:SI 431 [ i ])
        (subreg/u:SI (reg:DI 523 [ i ]) 0)) "../../gcc/gcc/genhooks.cc":198:8
323 {*movsi_internal}
     (nil))

i.e. the extension in 421 is changed to subreg and "/s" in 440 is removed. 
Anyway 440 is really suspicious regarding MIPS's TARGET_MODE_REP_EXTENDED
mandates SImode to be represented in sign-extended form.  Was 440 already
incorrect before ext-dce?  Or was it correct but then it's broken by ext-dce? 
Or is it still correct after ext-dce but then the later passes would do some
incorrect thing?

Reply via email to