On 29/02/16 11:21, Michael Collison wrote: > > > On 2/29/2016 4:06 AM, Kyrill Tkachov wrote: >> Hi Michael, >> >> On 29/02/16 04:47, Michael Collison wrote: >>> This patches address PR 70008, where a reverse subtract with carry >>> instruction can be generated in thumb2 mode. It was tested with no >>> regressions in arm and thumb modes on the following targets: >>> >>> arm-none-linux-gnueabi >>> arm-none-linux-gnuabihf >>> armeb-none-linux-gnuabihf >>> arm-none-eabi >>> >>> Okay for trunk? >>> >>> 2016-02-28 Michael Collison <michael.colli...@linaro.org> >>> >>> PR target/70008 >>> * config/arm/arm.md (*subsi3_carryin): Only match pattern if >>> TARGET_ARM due to 'rsc' instruction alternative. >>> * config/arm/thumb2.md (*thumb2_subsi3_carryin): New pattern. >>> >>> >> >> The *subsi3_carrying pattern has the arch attribute: >> (set_attr "arch" "*,a") >> >> That means that the second alternative that generates the RSC >> instruction is only enabled >> for ARM mode. Do you have a testcase where this doesn't happen and >> this pattern generates >> the second alternative for Thumb2? > > No I don't have a test case; i noticed the pattern when working on the > overflow project. I did not realize > that an attribute could affect the matching of an alternative. I will > close the bug. > >> >> >> Thanks, >> Kyrill >
This is all true, but there is a potential performance issue with this pattern though, that could lead to sub-optimal code. The predicate accepts reg-or-int, but in ARM state only simple 'const-ok-for-arm' immediates are permitted by the predicates, and in thumb code, no immediates are permitted at all. This could potentially result in sub-optimal code due to late splitting of the pattern. It would be better if the predicate understood these limitations and restricted immediates accordingly. R.