[cfe-commits] r167440 - in /cfe/trunk: lib/CodeGen/TargetInfo.cpp test/CodeGen/arm-arguments.c
Manman Ren
mren at apple.com
Tue Nov 6 11:06:44 PST 2012
Sorry, just re-installed the OS and forgot to enforce the check.
In r167476.
Manman
On Nov 6, 2012, at 11:00 AM, Bob Wilson wrote:
>
> On Nov 5, 2012, at 8:58 PM, Manman Ren <mren at apple.com> wrote:
>
>> Author: mren
>> Date: Mon Nov 5 22:58:01 2012
>> New Revision: 167440
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=167440&view=rev
>> Log:
>> ARM byval: when type alignment is bigger than ABI alignment, instead of
>> disabling byval, we set realign to true.
>>
>> It will perform an aligned alloca, and call memcpy to copy the byval
>> argument to the local variable.
>> Change the size threshold back to 64 bytes.
>>
>> rdar://12596507
>>
>> Modified:
>> cfe/trunk/lib/CodeGen/TargetInfo.cpp
>> cfe/trunk/test/CodeGen/arm-arguments.c
>>
>> Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=167440&r1=167439&r2=167440&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Mon Nov 5 22:58:01 2012
>> @@ -3221,16 +3221,15 @@
>>
>> // Support byval for ARM.
>> // The ABI alignment for APCS is 4-byte and for AAPCS at least 4-byte and at most 8-byte.
>> - // Byval can't handle the case where type alignment is bigger than ABI alignment.
>> - // We also increase the threshold for byval due to its overhead.
>> + // We realign the indirect argument if type alignment is bigger than ABI alignment.
>
> That doesn't fit in 80 columns, does it?
>
>> uint64_t ABIAlign = 4;
>> uint64_t TyAlign = getContext().getTypeAlign(Ty) / 8;
>> if (getABIKind() == ARMABIInfo::AAPCS_VFP ||
>> getABIKind() == ARMABIInfo::AAPCS)
>> ABIAlign = std::min(std::max(TyAlign, (uint64_t)4), (uint64_t)8);
>> - if (getContext().getTypeSizeInChars(Ty) > CharUnits::fromQuantity(64*8) &&
>> - TyAlign <= ABIAlign) {
>> - return ABIArgInfo::getIndirect(0, /*ByVal=*/true);
>> + if (getContext().getTypeSizeInChars(Ty) > CharUnits::fromQuantity(64)) {
>> + return ABIArgInfo::getIndirect(0, /*ByVal=*/true,
>> + /*Realign=*/TyAlign <= ABIAlign ? false : true);
>
> Isn't that the same as TyAlign > ABIAlign?
>
>> }
>>
>> // Otherwise, pass by coercing to a structure of the appropriate size.
>>
>> Modified: cfe/trunk/test/CodeGen/arm-arguments.c
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/arm-arguments.c?rev=167440&r1=167439&r2=167440&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/CodeGen/arm-arguments.c (original)
>> +++ cfe/trunk/test/CodeGen/arm-arguments.c Mon Nov 5 22:58:01 2012
>> @@ -191,3 +191,35 @@
>> // AAPCS: %[[a:.*]] = alloca { [1 x i32] }
>> // AAPCS: %[[gep:.*]] = getelementptr { [1 x i32] }* %[[a]], i32 0, i32 0
>> // AAPCS: load [1 x i32]* %[[gep]]
>> +
>> +// rdar://12596507
>> +struct s35
>> +{
>> + float v[18]; //make sure byval is on.
>> +} __attribute__((aligned(16)));
>> +typedef struct s35 s35_with_align;
>> +
>> +typedef __attribute__((neon_vector_type(4))) float float32x4_t;
>> +static __attribute__((__always_inline__, __nodebug__)) float32x4_t vaddq_f32(
>> + float32x4_t __a, float32x4_t __b) {
>> + return __a + __b;
>> +}
>> +float32x4_t f35(int i, s35_with_align s1, s35_with_align s2) {
>> + float32x4_t v = vaddq_f32(*(float32x4_t *)&s1,
>> + *(float32x4_t *)&s2);
>> + return v;
>> +}
>> +// APCS-GNU: define <4 x float> @f35(i32 %i, %struct.s35* byval, %struct.s35* byval)
>> +// APCS-GNU: %[[a:.*]] = alloca %struct.s35, align 16
>> +// APCS-GNU: %[[b:.*]] = bitcast %struct.s35* %[[a]] to i8*
>> +// APCS-GNU: %[[c:.*]] = bitcast %struct.s35* %0 to i8*
>> +// APCS-GNU: call void @llvm.memcpy.p0i8.p0i8.i32(i8* %[[b]], i8* %[[c]]
>> +// APCS-GNU: %[[d:.*]] = bitcast %struct.s35* %[[a]] to <4 x float>*
>> +// APCS-GNU: load <4 x float>* %[[d]], align 16
>> +// AAPCS: define arm_aapcscc <4 x float> @f35(i32 %i, %struct.s35* byval, %struct.s35* byval)
>> +// AAPCS: %[[a:.*]] = alloca %struct.s35, align 16
>> +// AAPCS: %[[b:.*]] = bitcast %struct.s35* %[[a]] to i8*
>> +// AAPCS: %[[c:.*]] = bitcast %struct.s35* %0 to i8*
>> +// AAPCS: call void @llvm.memcpy.p0i8.p0i8.i32(i8* %[[b]], i8* %[[c]]
>> +// AAPCS: %[[d:.*]] = bitcast %struct.s35* %[[a]] to <4 x float>*
>> +// AAPCS: load <4 x float>* %[[d]], align 16
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
More information about the cfe-commits
mailing list