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

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #1)
> So the problem seems like combine decides somehow to 
> combine:
> ```
> (insn 7 4 9 2 (set (reg/v:SF 100 [ xD.4459 ])
>         (plus:SF (reg/v:SF 102 [ aD.4455 ])
>             (reg/v:SF 103 [ bD.4456 ]))) "/app/example.cpp":6:7 1043 {addsf3}
>      (expr_list:REG_DEAD (reg/v:SF 102 [ aD.4455 ])
>         (nil)))
> (insn 9 7 10 2 (set (reg:SF 104 [ xD.4459 ])
>         (asm_operands:SF ("") ("=X") 0 [
>                 (reg/v:SF 100 [ xD.4459 ])
>             ]
>              [
>                 (asm_input:SF ("0") /app/example.cpp:8)
>             ]
>              [] /app/example.cpp:8)) "/app/example.cpp":8:5 -1
>      (expr_list:REG_DEAD (reg/v:SF 100 [ xD.4459 ])
>         (nil)))
> into:
> ```
> (insn 9 7 10 2 (set (reg:SF 104 [ xD.4459 ])
>         (asm_operands:SF ("") ("=X") 0 [
>                 (plus:SF (reg:SF 106)
>                     (reg/v:SF 103 [ bD.4456 ]))
>             ]
>              [
>                 (asm_input:SF ("0") /app/example.cpp:8)
>             ]
>              [] /app/example.cpp:8)) "/app/example.cpp":8:5 -1
>      (expr_list:REG_DEAD (reg:SF 106)
>         (nil)))
> ```
> 
> But the dump from combine does not make sense:
> ```
> Trying 7 -> 9:
>     7: r100:SF=r106:SF+r103:SF
>       REG_DEAD r106:SF
>     9: r104:SF=asm_operands
>       REG_DEAD r100:SF
> Failed to match this instruction:
> (set (reg:SF 104 [ xD.4459 ])
>     (asm_operands:SF ("") ("=X") 0 [
>             (plus:SF (reg:SF 106)
>                 (reg/v:SF 103 [ bD.4456 ]))
>         ]
>          [
>             (asm_input:SF ("0") /app/example.cpp:8)
>         ]
>          [] /app/example.cpp:8))
> allowing combination of insns 7 and 9
> original costs 8 + 4 = 12
> replacement cost 4
> deferring deletion of insn with uid = 7.
> modifying insn i3     9: r104:SF=asm_operands
>       REG_DEAD r106:SF
> deferring rescan insn with uid = 9.
> ```

So basically check_asm_operands accepts the insn because the plus matches the
operand but this is an output operand which does not work as it is not an
lvalue ...

Reply via email to