forked from OSchip/llvm-project
Fix x86-64 byval passing to specify the alignment even when the code
generator will give it something sufficient. This is important because the mid-level optimizer doesn't know what alignment is required otherwise. llvm-svn: 131879
This commit is contained in:
parent
f3ef3d2af9
commit
44c2b90556
|
@ -1315,13 +1315,10 @@ ABIArgInfo X86_64ABIInfo::getIndirectResult(QualType Ty) const {
|
|||
if (isRecordWithNonTrivialDestructorOrCopyConstructor(Ty))
|
||||
return ABIArgInfo::getIndirect(0, /*ByVal=*/false);
|
||||
|
||||
// Compute the byval alignment. We trust the back-end to honor the
|
||||
// minimum ABI alignment for byval, to make cleaner IR.
|
||||
const unsigned MinABIAlign = 8;
|
||||
unsigned Align = getContext().getTypeAlign(Ty) / 8;
|
||||
if (Align > MinABIAlign)
|
||||
return ABIArgInfo::getIndirect(Align);
|
||||
return ABIArgInfo::getIndirect(0);
|
||||
// Compute the byval alignment. We specify the alignment of the byval in all
|
||||
// cases so that the mid-level optimizer knows the alignment of the byval.
|
||||
unsigned Align = std::max(getContext().getTypeAlign(Ty) / 8, 8U);
|
||||
return ABIArgInfo::getIndirect(Align);
|
||||
}
|
||||
|
||||
/// Get16ByteVectorType - The ABI specifies that a value should be passed in an
|
||||
|
|
|
@ -69,7 +69,7 @@ void f12_1(struct s12 a0) {}
|
|||
|
||||
// Check that sret parameter is accounted for when checking available integer
|
||||
// registers.
|
||||
// CHECK: define void @f13(%struct.s13_0* sret %agg.result, i32 %a, i32 %b, i32 %c, i32 %d, {{.*}}* byval %e, i32 %f)
|
||||
// CHECK: define void @f13(%struct.s13_0* sret %agg.result, i32 %a, i32 %b, i32 %c, i32 %d, {{.*}}* byval align 8 %e, i32 %f)
|
||||
|
||||
struct s13_0 { long long f0[3]; };
|
||||
struct s13_1 { long long f0[2]; };
|
||||
|
|
Loading…
Reference in New Issue