On Fri, 22 Jul 2011, Ulrich Weigand wrote: > Richard Guenther wrote: > > > + /* { dg-lto-do run } */ > > + /* { dg-lto-options { { -O0 -flto } } } */ > > + /* { dg-extra-ld-options "-O2 -ffast-math -fuse-linker-plugin" } */ > > + /* { dg-require-linker-plugin "" } */ > > + > > + /* We require a linker plugin because otherwise we'd need to link > > + against libm which we are not sure here has cabs on all targets. > > + This is because collect2 invokes ld on the -O0 object code > > + which does not have folded cabs. */ > > + > > + double cabs(_Complex double); > > + double __attribute__((used)) > > + foo (_Complex double x, int b) > > + { > > + if (b) > > + x = 0; > > + return cabs(x); > > + } > > + int main() { return 0; } > > Now that we have the linker plugin, this fails on spu-elf with: > > /tmp/cce6KuRb.ltrans0.ltrans.o: In function `foo': > cce6KuRb.ltrans0.o:(.text+0x28): undefined reference to `sqrt' > > because nothing links against libm. I'm a bit confused by the comment > above: even with the linker plugin, where should libm be pulled in? > Don't we need to use -lm on the linker line anyway?
Well, the testcase was for an ICE which required that cabs is folded to sqrt(real**2 + imag**2), it requires "late" folding, thus -O0 during the compile step (it's a trick to use LTO here, to delay folding until after IPA opts). Not linking with -lm and relying on a HW sqrt instruction makes sure we do that late folding which we want to happen. So, if you can in any way retain all of the above features with fixing non-HW sqrt targets fine - otherwise I suggest you skip spu-elf. Richard.