r267496 - [lanai] Update handling of structs in arguments to be passed in registers.
Kostya Serebryany via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 25 18:59:43 PDT 2016
Hopefully fixed by r267513.
On Mon, Apr 25, 2016 at 6:46 PM, Kostya Serebryany <kcc at google.com> wrote:
> +rnk
>
> On Mon, Apr 25, 2016 at 5:09 PM, Jacques Pienaar via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>> Author: jpienaar
>> Date: Mon Apr 25 19:09:29 2016
>> New Revision: 267496
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=267496&view=rev
>> Log:
>> [lanai] Update handling of structs in arguments to be passed in registers.
>>
>> Previously aggregate types were passed byval, change the ABI to pass
>> these in registers instead.
>>
>>
>> Modified:
>> cfe/trunk/lib/CodeGen/TargetInfo.cpp
>> cfe/trunk/test/CodeGen/lanai-arguments.c
>>
>> Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=267496&r1=267495&r2=267496&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Mon Apr 25 19:09:29 2016
>> @@ -6691,6 +6691,7 @@ public:
>> I.info = classifyArgumentType(I.type, State);
>> }
>>
>> + ABIArgInfo getIndirectResult(QualType Ty, bool ByVal, CCState &State)
>> const;
>> ABIArgInfo classifyArgumentType(QualType RetTy, CCState &State) const;
>> };
>> } // end anonymous namespace
>> @@ -6712,21 +6713,72 @@ bool LanaiABIInfo::shouldUseInReg(QualTy
>> return true;
>> }
>>
>> +ABIArgInfo LanaiABIInfo::getIndirectResult(QualType Ty, bool ByVal,
>> + CCState &State) const {
>> + if (!ByVal) {
>> + if (State.FreeRegs) {
>> + --State.FreeRegs; // Non-byval indirects just use one pointer.
>> + return getNaturalAlignIndirectInReg(Ty);
>> + }
>> + return getNaturalAlignIndirect(Ty, false);
>> + }
>> +
>> + // Compute the byval alignment.
>> + constexpr unsigned MinABIStackAlignInBytes = 4;
>>
>
> This broke the build on Windows;
>
> C:\b\slave\sanitizer-windows\llvm\tools\clang\lib\CodeGen\TargetInfo.cpp(6727) : error C2065: 'constexpr' : undeclared identifier
>
>
>
>
>
>> + unsigned TypeAlign = getContext().getTypeAlign(Ty) / 8;
>> + return ABIArgInfo::getIndirect(CharUnits::fromQuantity(4),
>> /*ByVal=*/true,
>> + /*Realign=*/TypeAlign >
>> + MinABIStackAlignInBytes);
>> +}
>> +
>> ABIArgInfo LanaiABIInfo::classifyArgumentType(QualType Ty,
>> CCState &State) const {
>> - if (isAggregateTypeForABI(Ty))
>> - return getNaturalAlignIndirect(Ty);
>> + // Check with the C++ ABI first.
>> + const RecordType *RT = Ty->getAs<RecordType>();
>> + if (RT) {
>> + CGCXXABI::RecordArgABI RAA = getRecordArgABI(RT, getCXXABI());
>> + if (RAA == CGCXXABI::RAA_Indirect) {
>> + return getIndirectResult(Ty, /*ByVal=*/false, State);
>> + } else if (RAA == CGCXXABI::RAA_DirectInMemory) {
>> + return getNaturalAlignIndirect(Ty, /*ByRef=*/true);
>> + }
>> + }
>> +
>> + if (isAggregateTypeForABI(Ty)) {
>> + // Structures with flexible arrays are always indirect.
>> + if (RT && RT->getDecl()->hasFlexibleArrayMember())
>> + return getIndirectResult(Ty, /*ByVal=*/true, State);
>> +
>> + // Ignore empty structs/unions.
>> + if (isEmptyRecord(getContext(), Ty, true))
>> + return ABIArgInfo::getIgnore();
>> +
>> + llvm::LLVMContext &LLVMContext = getVMContext();
>> + unsigned SizeInRegs = (getContext().getTypeSize(Ty) + 31) / 32;
>> + if (SizeInRegs <= State.FreeRegs) {
>> + llvm::IntegerType *Int32 = llvm::Type::getInt32Ty(LLVMContext);
>> + SmallVector<llvm::Type *, 3> Elements(SizeInRegs, Int32);
>> + llvm::Type *Result = llvm::StructType::get(LLVMContext, Elements);
>> + State.FreeRegs -= SizeInRegs;
>> + return ABIArgInfo::getDirectInReg(Result);
>> + } else {
>> + State.FreeRegs = 0;
>> + }
>> + return getIndirectResult(Ty, true, State);
>> + }
>>
>> // Treat an enum type as its underlying type.
>> if (const auto *EnumTy = Ty->getAs<EnumType>())
>> Ty = EnumTy->getDecl()->getIntegerType();
>>
>> - if (shouldUseInReg(Ty, State))
>> - return ABIArgInfo::getDirectInReg();
>> -
>> - if (Ty->isPromotableIntegerType())
>> + bool InReg = shouldUseInReg(Ty, State);
>> + if (Ty->isPromotableIntegerType()) {
>> + if (InReg)
>> + return ABIArgInfo::getDirectInReg();
>> return ABIArgInfo::getExtend();
>> -
>> + }
>> + if (InReg)
>> + return ABIArgInfo::getDirectInReg();
>> return ABIArgInfo::getDirect();
>> }
>>
>>
>> Modified: cfe/trunk/test/CodeGen/lanai-arguments.c
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/lanai-arguments.c?rev=267496&r1=267495&r2=267496&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGen/lanai-arguments.c (original)
>> +++ cfe/trunk/test/CodeGen/lanai-arguments.c Mon Apr 25 19:09:29 2016
>> @@ -10,7 +10,7 @@ typedef struct {
>> int aa;
>> int bb;
>> } s1;
>> -// CHECK: define void @f1(%struct.s1* byval align 4 %i)
>> +// CHECK: define void @f1(i32 inreg %i.coerce0, i32 inreg %i.coerce1)
>> void f1(s1 i) {}
>>
>> typedef struct {
>> @@ -61,8 +61,8 @@ union simple_union {
>> int a;
>> char b;
>> };
>> -// Unions should be passed as byval structs.
>> -// CHECK: define void @f9(%union.simple_union* byval align 4 %s)
>> +// Unions should be passed inreg.
>> +// CHECK: define void @f9(i32 inreg %s.coerce)
>> void f9(union simple_union s) {}
>>
>> typedef struct {
>> @@ -70,6 +70,6 @@ typedef struct {
>> int b3 : 3;
>> int b8 : 8;
>> } bitfield1;
>> -// Bitfields should be passed as byval structs.
>> -// CHECK: define void @f10(%struct.bitfield1* byval align 4 %bf1)
>> +// Bitfields should be passed inreg.
>> +// CHECK: define void @f10(i32 inreg %bf1.coerce)
>> void f10(bitfield1 bf1) {}
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160425/4c6b4a84/attachment-0001.html>
More information about the cfe-commits
mailing list