On Sat, Jul 22, 2017 at 2:43 AM, Segher Boessenkool <segher@xxxxxxxxxxxxxxxxxxx> wrote: > ("i" matches everything "n" does; did you mean "rmi"? If you did > mean "ri", you should use nonmemory_operand). The "rni" is not a typo; I was uncertain of the difference between 'n' and 'i', so I decided to put both of them in. From the definitions, I deduced that 'i' can support symbolic constants and 'n' does not, and I wasn't sure what to make of the following definition of 'n': > ...Many systems cannot support assembly-time constants for operands > less than a word wide. Constraints for these operands should use 'n' rather > than 'i'. > > My question is, why does the compiler match the above RTL code to > > my "movhi" template? I have not specified an auto {pre,post} > > inc/decremented ("<" or ">") operand constraint anywhere in the > > "movhi" template; thus, surely the template match should fail, if the > > RTL that is attempted to be matched contains such a *cremented > > expression? > > Because your legitimate_address_p (or similar) is fine with it, > I suspect. The aforementioned RTL is not invalid; legitimate_address_p correctly permits addressing of that form. What I would like to do is prevent such RTL expressions from matching to the "movhi" template (which in my mind, it shouldn't have matched in the first place), so that it only matches the "pushhi" template.