[llvm-dev] SRET consistency between declaration and call site

Joerg Sonnenberger via llvm-dev
Tue, 06 Oct 2015 20:21:17 -0000

On Mon, Oct 05, 2015 at 03:45:29PM -0700, Reid Kleckner
wrote:
> > > On 3 October 2015 at 02:29, Joerg Sonnenberger via llvm-dev
> > > <llvm-dev at lists.llvm.org> wrote:
> > > > while debugging assertions when building libm for 32bit
Sparc, I hit
> > the
> > > > following IR:
> > > >
> > > >   complex_mul_libcall:
> > > >     call void @__muldc3({ double, double }* sret %tmp,
double %conv,
> > double 0.000000e+00, double %a.real, double %a.imag) #2
> > > >
> > > >   ...
> > > >
> > > >   declare void @__muldc3({ double, double }*, double,
double, double,
> > double)
> > > >
> > > > The same IR is essentially generated for i386 too, so it is
not Sparc
> > > > specific. Unlike i386, Sparc has an assertion in its codegen
that the
> > > > function called must have the sret attribute on
corresponding argument.
> > >
> I think the assertion is probably overzealous and would fire when it
> shouldn't in an LTO setting, but it sounds like it also caught a real
clang
> bug.

Can you give an example of where it would trigger in LTO and when should
not?

Joerg