Message ID | 4D1DE803.8060805@codesourcery.com |
---|---|
State | New |
Headers | show |
PING. On 12/31/2010 10:26 PM, Jie Zhang wrote: > Hi, > > I found this while looking at something else. The following code in > arm_legitimize_address is confusing for me: > > if (GET_CODE (x) == PLUS) > { > rtx xop0 = XEXP (x, 0); > rtx xop1 = XEXP (x, 1); > > if (CONSTANT_P (xop0) && !symbol_mentioned_p (xop0)) > xop0 = force_reg (SImode, xop0); > > if (CONSTANT_P (xop1) && !symbol_mentioned_p (xop1)) > xop1 = force_reg (SImode, xop1); <== code A > > if (ARM_BASE_REGISTER_RTX_P (xop0) > && GET_CODE (xop1) == CONST_INT) > { > ... <== code B > } > ... > } > > The code B will never be executed since xop1 will never be a CONST_INT. > If it were, it would have already been put into a reg by code A. > > I did some digging. "!symbol_mentioned_p (xop1)" was brought into the > code by revision 10681, which is every old and hence no patch email > > The attached patch replaces !symbol_mentioned_p with symbol_mentioned_p > in arm_legitimize_address. It shows an improvement for the following > small test: > > int buf[100000]; > int foo () > { > return buf[40000]; > } > > For the default multilib and -O2, the trunk without the patch gives > > foo: > ldr r3, .L2 > ldr r2, .L2+4 > ldr r0, [r2, r3] > bx lr > .L3: > .align 2 > .L2: > .word 160000 > .word buf > .size foo, .-foo > .comm buf,400000,4 > > With the patch: > > foo: > ldr r3, .L2 > ldr r0, [r3, #256] > bx lr > .L3: > .align 2 > .L2: > .word buf+159744 > .size foo, .-foo > .comm buf,400000,4 > > So with the patch, we save one LDR instruction and one entry in constant > pool. No regressions are found when testing arm-none-eabi for the > default multilib with --target_board=arm-sim. > > OK? > > Regards,
On Mon, Jan 17, 2011 at 2:12 AM, Jie Zhang <jie@codesourcery.com> wrote: > PING. > > On 12/31/2010 10:26 PM, Jie Zhang wrote: >> >> Hi, >> >> I found this while looking at something else. The following code in >> arm_legitimize_address is confusing for me: >> >> if (GET_CODE (x) == PLUS) >> { >> rtx xop0 = XEXP (x, 0); >> rtx xop1 = XEXP (x, 1); >> >> if (CONSTANT_P (xop0) && !symbol_mentioned_p (xop0)) >> xop0 = force_reg (SImode, xop0); >> >> if (CONSTANT_P (xop1) && !symbol_mentioned_p (xop1)) >> xop1 = force_reg (SImode, xop1); <== code A >> >> if (ARM_BASE_REGISTER_RTX_P (xop0) >> && GET_CODE (xop1) == CONST_INT) >> { >> ... <== code B >> } >> ... >> } >> >> The code B will never be executed since xop1 will never be a CONST_INT. >> If it were, it would have already been put into a reg by code A. Yeah I went through this and couldn't make out why this is the way it is. Looks good to me though I can't approve or reject your patch. cheers Ramana > >> OK? >> >> Regards, > > > -- > Jie Zhang > >
On 01/21/2011 02:58 AM, Ramana Radhakrishnan wrote: > On Mon, Jan 17, 2011 at 2:12 AM, Jie Zhang<jie@codesourcery.com> wrote: >> PING. >> >> On 12/31/2010 10:26 PM, Jie Zhang wrote: >>> >>> Hi, >>> >>> I found this while looking at something else. The following code in >>> arm_legitimize_address is confusing for me: >>> >>> if (GET_CODE (x) == PLUS) >>> { >>> rtx xop0 = XEXP (x, 0); >>> rtx xop1 = XEXP (x, 1); >>> >>> if (CONSTANT_P (xop0)&& !symbol_mentioned_p (xop0)) >>> xop0 = force_reg (SImode, xop0); >>> >>> if (CONSTANT_P (xop1)&& !symbol_mentioned_p (xop1)) >>> xop1 = force_reg (SImode, xop1);<== code A >>> >>> if (ARM_BASE_REGISTER_RTX_P (xop0) >>> && GET_CODE (xop1) == CONST_INT) >>> { >>> ...<== code B >>> } >>> ... >>> } >>> >>> The code B will never be executed since xop1 will never be a CONST_INT. >>> If it were, it would have already been put into a reg by code A. > > Yeah I went through this and couldn't make out why this is the way it > is. Looks good to me though I can't approve or reject your patch. > Thanks for taking a look! That piece of code can be traced back to more than 15 years ago. Maybe only Richard still remembers the original reason behind it. Regards,
On Fri, 2011-01-21 at 10:28 +0800, Jie Zhang wrote: > On 01/21/2011 02:58 AM, Ramana Radhakrishnan wrote: > > On Mon, Jan 17, 2011 at 2:12 AM, Jie Zhang<jie@codesourcery.com> wrote: > >> PING. > >> > >> On 12/31/2010 10:26 PM, Jie Zhang wrote: > >>> > >>> Hi, > >>> > >>> I found this while looking at something else. The following code in > >>> arm_legitimize_address is confusing for me: > >>> > >>> if (GET_CODE (x) == PLUS) > >>> { > >>> rtx xop0 = XEXP (x, 0); > >>> rtx xop1 = XEXP (x, 1); > >>> > >>> if (CONSTANT_P (xop0)&& !symbol_mentioned_p (xop0)) > >>> xop0 = force_reg (SImode, xop0); > >>> > >>> if (CONSTANT_P (xop1)&& !symbol_mentioned_p (xop1)) > >>> xop1 = force_reg (SImode, xop1);<== code A > >>> > >>> if (ARM_BASE_REGISTER_RTX_P (xop0) > >>> && GET_CODE (xop1) == CONST_INT) > >>> { > >>> ...<== code B > >>> } > >>> ... > >>> } > >>> > >>> The code B will never be executed since xop1 will never be a CONST_INT. > >>> If it were, it would have already been put into a reg by code A. > > > > Yeah I went through this and couldn't make out why this is the way it > > is. Looks good to me though I can't approve or reject your patch. > > > Thanks for taking a look! That piece of code can be traced back to more > than 15 years ago. Maybe only Richard still remembers the original > reason behind it. Probably - Just noticed that you'd tested only for the basic multilibs.It might be worth testing for a vfp variant at v7-a just of paranoia since this is a code path that hasn't been exercised for 15 years though I think it should be safe. Ramana > > > Regards,
On 01/21/2011 06:35 PM, Ramana Radhakrishnan wrote: > > On Fri, 2011-01-21 at 10:28 +0800, Jie Zhang wrote: >> On 01/21/2011 02:58 AM, Ramana Radhakrishnan wrote: >>> On Mon, Jan 17, 2011 at 2:12 AM, Jie Zhang<jie@codesourcery.com> wrote: >>>> PING. >>>> >>>> On 12/31/2010 10:26 PM, Jie Zhang wrote: >>>>> >>>>> Hi, >>>>> >>>>> I found this while looking at something else. The following code in >>>>> arm_legitimize_address is confusing for me: >>>>> >>>>> if (GET_CODE (x) == PLUS) >>>>> { >>>>> rtx xop0 = XEXP (x, 0); >>>>> rtx xop1 = XEXP (x, 1); >>>>> >>>>> if (CONSTANT_P (xop0)&& !symbol_mentioned_p (xop0)) >>>>> xop0 = force_reg (SImode, xop0); >>>>> >>>>> if (CONSTANT_P (xop1)&& !symbol_mentioned_p (xop1)) >>>>> xop1 = force_reg (SImode, xop1);<== code A >>>>> >>>>> if (ARM_BASE_REGISTER_RTX_P (xop0) >>>>> && GET_CODE (xop1) == CONST_INT) >>>>> { >>>>> ...<== code B >>>>> } >>>>> ... >>>>> } >>>>> >>>>> The code B will never be executed since xop1 will never be a CONST_INT. >>>>> If it were, it would have already been put into a reg by code A. >>> >>> Yeah I went through this and couldn't make out why this is the way it >>> is. Looks good to me though I can't approve or reject your patch. >>> >> Thanks for taking a look! That piece of code can be traced back to more >> than 15 years ago. Maybe only Richard still remembers the original >> reason behind it. > > Probably - Just noticed that you'd tested only for the basic > multilibs.It might be worth testing for a vfp variant at v7-a just of > paranoia since this is a code path that hasn't been exercised for 15 > years though I think it should be safe. > I did a regression testing with "-march=armv7-a -mfloat-abi=softfp -mfpu=neon" on qemu for gcc, g++, libstdc++. No regressions are found.
* config/arm/arm.c (arm_legitimize_address): Replace !symbol_mentioned_p with symbol_mentioned_p. Index: config/arm/arm.c =================================================================== --- config/arm/arm.c (revision 168310) +++ config/arm/arm.c (working copy) @@ -6217,10 +6217,10 @@ arm_legitimize_address (rtx x, rtx orig_ rtx xop0 = XEXP (x, 0); rtx xop1 = XEXP (x, 1); - if (CONSTANT_P (xop0) && !symbol_mentioned_p (xop0)) + if (CONSTANT_P (xop0) && symbol_mentioned_p (xop0)) xop0 = force_reg (SImode, xop0); - if (CONSTANT_P (xop1) && !symbol_mentioned_p (xop1)) + if (CONSTANT_P (xop1) && symbol_mentioned_p (xop1)) xop1 = force_reg (SImode, xop1); if (ARM_BASE_REGISTER_RTX_P (xop0) @@ -6269,7 +6269,7 @@ arm_legitimize_address (rtx x, rtx orig_ if (CONSTANT_P (xop0)) xop0 = force_reg (SImode, xop0); - if (CONSTANT_P (xop1) && ! symbol_mentioned_p (xop1)) + if (CONSTANT_P (xop1) && symbol_mentioned_p (xop1)) xop1 = force_reg (SImode, xop1); if (xop0 != XEXP (x, 0) || xop1 != XEXP (x, 1))