On 11/19/24 12:01 PM, Jeff Law wrote:
Andreas reported GCC mis-compiled GAS for risc-v  Thankfully he also reduced it to a nice little testcase.

So the whole point of the pattern in question is to "reduce" the constants by right shifting away common unnecessary bits in RTL expressions like this:

  [(set (pc)
        (if_then_else (any_eq
                    (and:ANYI (match_operand:ANYI 1 "register_operand" "r")                           (match_operand 2 "shifted_const_arith_operand" "i"))
                    (match_operand 3 "shifted_const_arith_operand" "i"))
         (label_ref (match_operand 0 "" ""))
         (pc)))


When applicable, the reduced constants in operands 2/3 fit into a simm12 and thus do not need multi-instruction synthesis.  Note that we have to also shift operand 1.

That shift should have been an arithmetic shift, but was incorrectly coded as a logical shift.

Fixed with the obvious change on the right shift opcode.

Expecting to push to the trunk once the pre-commit tester renders its verdict.  I've already tested in this my tester for rv32 and rv64.
If you look at the patch, it's got a hunk from a different bugfix :-) Obviously that'll need to be addressed.

jeff

Reply via email to