This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: How to replace -O1 with corresponding -f's?
On Mon, Jun 20, 2005 at 07:57:17PM +0400, Sergei Organov wrote:
> Andrew Pinski <pinskia@physics.uc.edu> writes:
>
> > On Jun 20, 2005, at 11:28 AM, Sergei Organov wrote:
> >
> > > Andrew Pinski <pinskia@physics.uc.edu> writes:
> > >
> > >> On Jun 20, 2005, at 10:54 AM, Sergei Organov wrote:
> > >>
> > >>> so SYMBOL_FLAG_SMALL (flags 0x6 vs 0x2) is somehow being missed when -O1
> >
> > >>
> > >>> is turned on. Seems to be something at tree-to-RTX conversion time.
> > >>> Constant folding?
> > >>
> > >> No, it would mean that the target says that this is not a small data.
> > >> Also try it with the following code and you will see there is no
> > >> difference:
> >
> > >>
> > >> double osvf() { return 314314314; }
> > >
> > > There is no difference in the sense that here both -O0 and -O1 behave
> > > roughly the same. So the problem is with detecting "smallness" for true
> > > constants by the target, right?
> >
> > I think the bug is in rs6000_elf_in_small_data_p but since I have not
> > debuged it yet I don't know for sure.
> >
> > Could you file a bug? This is a target bug.
>
> Yeah, and I've reported it rather long ago against gcc-3.3 (PR 9571).
> That time there were 3 problems reported in the PR of which only the
> first one seems to be fixed (or are the rest just re-appeared in 4.0?).
>
> I think PR 9571 is in fact regression with respect to 2.95.x despite the
> [wrong] comments:
>
> ------- Additional Comment #5 From Franz Sirl 2003-06-17 15:31 [reply] -------
>
> r0 is used as a pointer to sdata2, this is a bug, it should be r2. And
> since only r2 is initialized in the ecrt*.o files, how can this work?
> Besides that, even if you initialize r0 manually, it is practically
> clobbered in about every function.
It's been a long time since I've hacked the PowerPC, but IIRC the instruction
set, a base register of '0' does not mean r0, but instead it means use 0 as the
base address. Every place that uses a base register should use the register
class 'b' (BASE_REGS) instead of 'r' (GENERAL_REGS), which excludes r0 from
being considered.
Under the 32-bit eABI calling sequence, you have three small data areas:
The small data area that r2 points to (.sdata/.sbss).
The small data area that r13 points to (.sdata2/.sbss2).
The small data area centered around location 0 (ie, small positive addresses,
and the most negative addresses). I don't recall that we had special sections
for this, since for many embedded apps, they couldn't allocate to those
addresses.
For these relocations, you should use R_PPC_EMB_SDA21, which the linker will
fill in both the offset and the appropriate base register into the instruction.
> ------- Additional Comment #6 From Mark Mitchell 2003-07-20 00:52 [reply] -------
>
> Based on Franz's comments, this bug is not really a regression at all.
> I've therefore removed the regression tags.
>
> that I've tried to explain in my comment #7.
>
> I don't think I need to file yet another PR in this situation, right?
>
> --
> Sergei.
>
--
Michael Meissner
email: gnu@the-meissners.org
http://www.the-meissners.org