On 09/06/2017 10:17 AM, Richard Henderson wrote: >> Yea. I'd also expect zero/nonzero bits tracking in combine to catch >> this. Shouldn't the sign bit be known to be zero after the shift which >> makes the extension redundant regardless of the SUBREG_PROMOTED flag? > You're right, this should be irrelevant. Any anyway combine should be > constrained by modes, so it should require the SIGN_EXTEND to be present just > to make the modes match up. Perhaps this test case is being suppressed > because > of something else, e.g. failure to combine insns when a hard-reg is involved?
It turns out that combine would like to match (set (reg:DI 75) (zero_extract:DI (reg:DI 10 a0 [ rs1 ]) (const_int 8 [0x8]) (const_int 24 [0x18]))) which seems reasonable enough to add as a pattern (define_code_iterator any_extract [sign_extract zero_extract]) (define_code_attr [(sign_extract "sra") (zero_extract "srl")]) (define_insn "*<optab>_si_high" (set (match_operand:DI 0 "register_operand" "=r") (any_extract:DI (match_operand:DI 1 "register_operand" "r") (match_operand:DI 2 "const_int_operand" "") (match_operand:DI 3 "const_int_operand" ""))) "TARGET_64BIT && INTVAL (operand[3]) > 0 && INTVAL (operand[2]) + INTVAL (operand[3]) == 32" "<insn>w\t%0,%1,%3" [(set_attr "type" "shift") (set_attr "mode" "SI")]) r~