Aurelien Buhrig <aurelien.buhrig.gcc@xxxxxxxxx> writes: > I defined this insn which uses a "temporary" register whose value is > used for next rotation by 1: > > (define_insn "rotrhi3_cst1" > [(set (match_operand:HI 0 "d_operand" "=d") > (rotatert:HI (match_operand:HI 1 "d_operand" "0") > (const_int 1))) > (use (match_operand:HI 2 "d_operand" "+&d"))] > "" > "rrc.w\t%2\t| \trrc.w\t%0 ; rotr1") I don't know what these instructions do, but if the temporary register is only used by this insn you should use match_scratch. If the register is used by other subsequent instructions then you need to set it, not just use it. > So it uses the same register for the use operand %2 and for the operands > %0/%1 despite the +& modifers... It's a bit confusing, but the +& modifiers are only for register allocation. The CSE pass is before register allocation, and it is only looking at what the RTL says. The RTL says that the register is used but not set, so the compiler feels free to feed in the same register. > The doc says about use: > "use can only be used to describe that the register is live. You > should think twice before adding use statements, more often you will > want to use unspec instead." > > Does it mean that it's not possible using "use" and the only way to do > this is to create an unspec insn ? You can use a "use" statement as long as you know what it means. The comment in the doc is there because what it means is not what most people actually want. Ian