On 13 August 2016 at 00:00, Michael Collison <michael.colli...@arm.com> wrote: > Christophe, > > I have resolved the issue you identified. I had not update my upstream patch > with a previous fix I had made to the usubv pattern. Tested and bootstrapped > on arm hardware. >
Hi Michael, Indeed, I can confirm that I no longer see the regressions I reported with the previous version. The new tests now pass. Thanks Christophe > This patch improves code generations for builtin arithmetic overflow > operations for the arm backend. As an example for a simple test case such as: > > Sure for a simple test case such as: > > int > fn3 (int x, int y, int *ovf) > { > int res; > *ovf = __builtin_sadd_overflow (x, y, &res); > return res; > } > > Current trunk at -O2 generates > > fn3: > @ args = 0, pretend = 0, frame = 0 > @ frame_needed = 0, uses_anonymous_args = 0 > @ link register save eliminated. > cmp r1, #0 > mov r3, #0 > add r1, r0, r1 > blt .L4 > cmp r1, r0 > blt .L3 > .L2: > str r3, [r2] > mov r0, r1 > bx lr > .L4: > cmp r1, r0 > ble .L2 > .L3: > mov r3, #1 > b .L2 > > With the patch this now generates: > > adds r0, r0, r1 > movvs r3, #1 > movvc r3, #0 > str r3, [r2] > bx lr > > Ok for trunk? > > 2016-07-27 Michael Collison <michael.colli...@linaro.org> > Michael Collison <michael.colli...@arm.com> > > * config/arm/arm-modes.def: Add new condition code mode CC_V > to represent the overflow bit. > * config/arm/arm.c (maybe_get_arm_condition_code): > Add support for CC_Vmode. > (arm_gen_unlikely_cbranch): New function to generate common > rtl conditional branches for overflow patterns. > * config/arm/arm-protos.h: Add prototype for > arm_gen_unlikely_cbranch. > * config/arm/arm.md (addv<mode>4, add<mode>3_compareV, > addsi3_compareV_upper): New patterns to support signed > builtin overflow add operations. > (uaddv<mode>4, add<mode>3_compareC, addsi3_compareV_upper): > New patterns to support unsigned builtin add overflow operations. > (subv<mode>4, sub<mode>3_compare1): New patterns to support signed > builtin overflow subtract operations, > (usubv<mode>4): New patterns to support unsigned builtin subtract > overflow operations. > (negvsi3, negvdi3, negdi2_compare, negsi2_carryin_compare): New > patterns > to support builtin overflow negate operations. > * gcc.target/arm/builtin_saddl.c: New testcase. > * gcc.target/arm/builtin_saddll.c: New testcase. > * gcc.target/arm/builtin_uaddl.c: New testcase. > * gcc.target/arm/builtin_uaddll.c: New testcase. > * gcc.target/arm/builtin_ssubl.c: New testcase. > * gcc.target/arm/builtin_ssubll.c: New testcase. > * gcc.target/arm/builtin_usubl.c: New testcase. > * gcc.target/arm/builtin_usubll.c: New testcase. > > -----Original Message----- > From: Christophe Lyon [mailto:christophe.l...@linaro.org] > Sent: Wednesday, August 03, 2016 6:00 AM > To: Michael Collison > Cc: gcc-patches@gcc.gnu.org; James Greenhalgh; Kyrylo Tkachov; nd > Subject: Re: [ARM][PATCH] Add support for overflow add, sub, and neg > operations > > On 2 August 2016 at 10:13, Michael Collison <michael.colli...@arm.com> wrote: >> Hi, >> >> This patch improves code generations for builtin arithmetic overflow >> operations for the arm backend. As an example for a simple test case such as: >> >> int >> fn3 (int x, int y, int *ovf) >> { >> int res; >> *ovf = __builtin_sadd_overflow (x, y, &res); >> return res; >> } >> >> Current trunk at -O2 generates >> >> fn3: >> @ args = 0, pretend = 0, frame = 0 >> @ frame_needed = 0, uses_anonymous_args = 0 >> @ link register save eliminated. >> cmp r1, #0 >> mov r3, #0 >> add r1, r0, r1 >> blt .L4 >> cmp r1, r0 >> blt .L3 >> .L2: >> str r3, [r2] >> mov r0, r1 >> bx lr >> .L4: >> cmp r1, r0 >> ble .L2 >> .L3: >> mov r3, #1 >> b .L2 >> >> With the patch this now generates: >> >> adds r0, r0, r1 >> movvs r3, #1 >> movvc r3, #0 >> str r3, [r2] >> bx lr >> >> Ok for trunk? >> > > Hi Michael, > > I've run validations with your patch, and I am seeing several failures during > tests execution: > http://people.linaro.org/~christophe.lyon/cross-validation/gcc-test-patches/239008-bugzilla-69663-upstream-final/report-build-info.html > > I'm using qemu 2.6.0. > > Did you run validation on actual HW? It could be a qemu bug, but I haven't > tried to manually reproduce the problem yet. > > Christophe. > > >> 2016-07-27 Michael Collison <michael.colli...@linaro.org> >> Michael Collison <michael.colli...@arm.com> >> >> * config/arm/arm-modes.def: Add new condition code mode CC_V >> to represent the overflow bit. >> * config/arm/arm.c (maybe_get_arm_condition_code): >> Add support for CC_Vmode. >> (arm_gen_unlikely_cbranch): New function to generate common >> rtl conditional branches for overflow patterns. >> * config/arm/arm-protos.h: Add prototype for >> arm_gen_unlikely_cbranch. >> * config/arm/arm.md (addv<mode>4, add<mode>3_compareV, >> addsi3_compareV_upper): New patterns to support signed >> builtin overflow add operations. >> (uaddv<mode>4, add<mode>3_compareC, addsi3_compareV_upper): >> New patterns to support unsigned builtin add overflow operations. >> (subv<mode>4, sub<mode>3_compare1): New patterns to support signed >> builtin overflow subtract operations, >> (usubv<mode>4): New patterns to support unsigned builtin subtract >> overflow operations. >> (negvsi3, negvdi3, negdi2_compare, negsi2_carryin_compare): New patterns >> to support builtin overflow negate operations. >> * gcc.target/arm/builtin_saddl.c: New testcase. >> * gcc.target/arm/builtin_saddll.c: New testcase. >> * gcc.target/arm/builtin_uaddl.c: New testcase. >> * gcc.target/arm/builtin_uaddll.c: New testcase. >> * gcc.target/arm/builtin_ssubl.c: New testcase. >> * gcc.target/arm/builtin_ssubll.c: New testcase. >> * gcc.target/arm/builtin_usubl.c: New testcase. >> * gcc.target/arm/builtin_usubll.c: New testcase. >