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

Joerg Sonnenberger via llvm-dev llvm-dev at lists.llvm.org
Tue Oct 6 13:21:17 PDT 2015


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


More information about the llvm-dev mailing list