This is an archive of the discontinued LLVM Phabricator instance.

[CodeGen][va_args] Correct Vector Struct va-arg 'in_reg' code gen
ClosedPublic

Authored by erichkeane on Feb 1 2018, 12:43 PM.

Details

Summary

When trying to track down a different bug, we discovered
that calling __builtin_va_arg on a vec3f type caused
the SROA pass to issue a warning that there was an illegal
access.

Further research showed that the vec3f type is
alloca'ed as size '12', but the _builtin_va_arg code
on x86_64 was always loading this out of registers as
{double, double}. Thus, the 2nd store into the vec3f
was storing in bytes 12-15!

This patch alters the original implementation which always
assumed {double, double} to use the actual coerced type
instead, so the LLVM-IR generated is a load/GEP/store of
a <2 x float> and a float, rather than a double and a double.

Tests were added for all combinations I could think of that
would fit in 2 FP registers, and all work exactly as expected.

Diff Detail

Event Timeline

erichkeane created this revision.Feb 1 2018, 12:43 PM
rjmccall accepted this revision.Feb 1 2018, 11:13 PM

Okay. LGTM.

This revision is now accepted and ready to land.Feb 1 2018, 11:13 PM
This revision was automatically updated to reflect the committed changes.