This is the mail archive of the
mailing list for the GCC project.
Re: avoiding recursive calls of calloc due to optimization
- From: Daniel Gutson <daniel dot gutson at tallertechnologies dot com>
- To: Andrew Pinski <pinskia at gmail dot com>
- Cc: gcc Mailing List <gcc at gcc dot gnu dot org>, glisse at gcc dot gnu dot org, Sebastian Huber <sebastian dot huber at embedded-brains dot de>
- Date: Mon, 21 Sep 2015 15:33:07 -0300
- Subject: Re: avoiding recursive calls of calloc due to optimization
- Authentication-results: sourceware.org; auth=none
- References: <CAF5HaEWYyPpxQe_iJqF8LXn_Yp-8aJ6uzMP-nzK9Y5UhRX_JwQ at mail dot gmail dot com> <CA+=Sn1nTxi2V8YjxeMUc41KATyecGqs+=oR_c4W3WnHWZwTkpg at mail dot gmail dot com>
On Mon, Sep 21, 2015 at 2:26 PM, Andrew Pinski <firstname.lastname@example.org> wrote:
> On Mon, Sep 21, 2015 at 10:20 AM, Daniel Gutson
> <email@example.com> wrote:
>> This is derived from https://gcc.gnu.org/ml/gcc-help/2015-03/msg00091.html
>> Currently, gcc provides an optimization that transforms a call to
>> malloc and a call to memset into a call to calloc.
>> This is fine except when it takes place within the calloc() function
>> implementation itself, causing a recursive call.
>> Two alternatives have been proposed: -fno-malloc-builtin and disable
>> optimizations in calloc().
>> I think the former is suboptimal since it affects all the code just
>> because of the implementation of one function (calloc()),
>> whereas the latter is suboptimal too since it disables the
>> optimizations in the whole function (calloc too).
>> I think of two alternatives: either make -fno-calloc-builtin to
>> disable the optimization, or make the optimization aware of the
>> function context where it is operating and prevent it to do the
>> transformation if the function is calloc().
>> Please help me to find the best alternative so we can implent it.
> Did you try the optimize attribute?
That is the 2nd alternative I mentioned as proposed. And I'm also aware that
the optimize attribute is somehow broken. Anyway, as I mentioned, I'd like to
avoid disabling (all the other) optimizations for calloc's implementation.
(FWIW, setting optimize as function attribute to O1 "fixes" the issue).
> Also you can try the following:
> size_t ns = size*elements;
> If (ns / elements != size)
> return NULL;
> void *ptr = malloc (ns);
> asm ("":"+r"(ptr));
> memset (ptr, 0, ns);
> Notice I put in a check for overflow in there.
Thanks, it's a nice workaround.
> Andrew Pinski
Daniel F. Gutson
Chief Engineering Officer, SPD
San Lorenzo 47, 3rd Floor, Office 5
Phone: +54 351 4217888 / +54 351 4218211