Author: petarj Date: Tue May 26 08:30:54 2015 New Revision: 238200 URL: http://llvm.org/viewvc/llvm-project?rev=238200&view=rev Log: [MIPS] fix extension of integer types (function calls)
On MIPS unsigned int type should not be zero extended but sign-extended. Patch by Strahinja Petrovic. Differential Revision: http://reviews.llvm.org/D9198 Added: cfe/trunk/test/CodeGen/mips-unsigned-ext-var.c cfe/trunk/test/CodeGen/mips-unsigned-extend.c Modified: cfe/trunk/lib/CodeGen/ABIInfo.h cfe/trunk/lib/CodeGen/CGCall.cpp cfe/trunk/lib/CodeGen/TargetInfo.cpp cfe/trunk/test/CodeGen/atomics-inlining.c cfe/trunk/test/CodeGenCXX/mips-size_t-ptrdiff_t.cpp Modified: cfe/trunk/lib/CodeGen/ABIInfo.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ABIInfo.h?rev=238200&r1=238199&r2=238200&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/ABIInfo.h (original) +++ cfe/trunk/lib/CodeGen/ABIInfo.h Tue May 26 08:30:54 2015 @@ -87,6 +87,8 @@ namespace clang { virtual bool isHomogeneousAggregateSmallEnough(const Type *Base, uint64_t Members) const; + virtual bool shouldSignExtUnsignedType(QualType Ty) const; + bool isHomogeneousAggregate(QualType Ty, const Type *&Base, uint64_t &Members) const; Modified: cfe/trunk/lib/CodeGen/CGCall.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=238200&r1=238199&r2=238200&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGCall.cpp (original) +++ cfe/trunk/lib/CodeGen/CGCall.cpp Tue May 26 08:30:54 2015 @@ -1588,8 +1588,12 @@ void CodeGenModule::ConstructAttributeLi case ABIArgInfo::Extend: if (ParamType->isSignedIntegerOrEnumerationType()) Attrs.addAttribute(llvm::Attribute::SExt); - else if (ParamType->isUnsignedIntegerOrEnumerationType()) - Attrs.addAttribute(llvm::Attribute::ZExt); + else if (ParamType->isUnsignedIntegerOrEnumerationType()) { + if (getTypes().getABIInfo().shouldSignExtUnsignedType(ParamType)) + Attrs.addAttribute(llvm::Attribute::SExt); + else + Attrs.addAttribute(llvm::Attribute::ZExt); + } // FALL THROUGH case ABIArgInfo::Direct: if (ArgNo == 0 && FI.isChainCall()) Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=238200&r1=238199&r2=238200&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original) +++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Tue May 26 08:30:54 2015 @@ -108,6 +108,10 @@ bool ABIInfo::isHomogeneousAggregateSmal return false; } +bool ABIInfo::shouldSignExtUnsignedType(QualType Ty) const { + return false; +} + void ABIArgInfo::dump() const { raw_ostream &OS = llvm::errs(); OS << "(ABIArgInfo Kind="; @@ -5547,6 +5551,7 @@ public: void computeInfo(CGFunctionInfo &FI) const override; llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty, CodeGenFunction &CGF) const override; + bool shouldSignExtUnsignedType(QualType Ty) const override; }; class MIPSTargetCodeGenInfo : public TargetCodeGenInfo { @@ -5849,6 +5854,16 @@ llvm::Value* MipsABIInfo::EmitVAArg(llvm return AddrTyped; } +bool MipsABIInfo::shouldSignExtUnsignedType(QualType Ty) const { + int TySize = getContext().getTypeSize(Ty); + + // MIPS64 ABI requires unsigned 32 bit integers to be sign extended. + if (Ty->isUnsignedIntegerOrEnumerationType() && TySize == 32) + return true; + + return false; +} + bool MIPSTargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, llvm::Value *Address) const { Modified: cfe/trunk/test/CodeGen/atomics-inlining.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/atomics-inlining.c?rev=238200&r1=238199&r2=238200&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/atomics-inlining.c (original) +++ cfe/trunk/test/CodeGen/atomics-inlining.c Tue May 26 08:30:54 2015 @@ -76,8 +76,8 @@ void test1(void) { // MIPS32: store atomic i32 {{.*}}, i32* @i1 seq_cst // MIPS32: call i64 @__atomic_load_8(i8* bitcast (i64* @ll1 to i8*) // MIPS32: call void @__atomic_store_8(i8* bitcast (i64* @ll1 to i8*), i64 -// MIPS32: call void @__atomic_load(i32 zeroext 100, i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a1, i32 0, i32 0), i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a2, i32 0, i32 0) -// MIPS32: call void @__atomic_store(i32 zeroext 100, i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a1, i32 0, i32 0), i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a2, i32 0, i32 0) +// MIPS32: call void @__atomic_load(i32 signext 100, i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a1, i32 0, i32 0), i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a2, i32 0, i32 0) +// MIPS32: call void @__atomic_store(i32 signext 100, i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a1, i32 0, i32 0), i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a2, i32 0, i32 0) // MIPS64-LABEL: define void @test1 // MIPS64: = load atomic i8, i8* @c1 seq_cst Added: cfe/trunk/test/CodeGen/mips-unsigned-ext-var.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/mips-unsigned-ext-var.c?rev=238200&view=auto ============================================================================== --- cfe/trunk/test/CodeGen/mips-unsigned-ext-var.c (added) +++ cfe/trunk/test/CodeGen/mips-unsigned-ext-var.c Tue May 26 08:30:54 2015 @@ -0,0 +1,22 @@ +// RUN: %clang -target mips64-unknown-linux -O2 -mabi=n64 -S -emit-llvm %s -o - | FileCheck %s -check-prefix=N64 +// RUN: %clang -target mips64-unknown-linux -O2 -mabi=n32 -S -emit-llvm %s -o - | FileCheck %s -check-prefix=N32 +// RUN: %clang -target mips-unknown-linux -O2 -mabi=o32 -S -emit-llvm %s -o - | FileCheck %s -check-prefix=O32 + +#include <stdarg.h> + +unsigned foo(int x, ...) { + va_list valist; + va_start(valist, x); + unsigned a; + a = va_arg(valist, unsigned); + return a; +} + +void foo1() { + unsigned f = 0xffffffe0; + foo(1,f); +} + +//N64: call i32 (i32, ...) @foo(i32 signext undef, i32 signext -32) +//N32: call i32 (i32, ...) @foo(i32 signext undef, i32 signext -32) +//O32: call i32 (i32, ...) @foo(i32 signext undef, i32 signext -32) \ No newline at end of file Added: cfe/trunk/test/CodeGen/mips-unsigned-extend.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/mips-unsigned-extend.c?rev=238200&view=auto ============================================================================== --- cfe/trunk/test/CodeGen/mips-unsigned-extend.c (added) +++ cfe/trunk/test/CodeGen/mips-unsigned-extend.c Tue May 26 08:30:54 2015 @@ -0,0 +1,15 @@ +// RUN: %clang -target mips64-unknown-linux -O0 -mabi=n64 -S -emit-llvm %s -o - | FileCheck %s -check-prefix=N64 +// RUN: %clang -target mips64-unknown-linux -O0 -mabi=n32 -S -emit-llvm %s -o - | FileCheck %s -check-prefix=N32 +// RUN: %clang -target mips-unknown-linux -O0 -mabi=o32 -S -emit-llvm %s -o - | FileCheck %s -check-prefix=O32 + +void foo(unsigned a) { +} + +void foo1() { + unsigned f = 0xffffffe0; + foo(f); +} + +// N64: call void @foo(i32 signext %0) +// N32: call void @foo(i32 signext %0) +// O32: call void @foo(i32 signext %0) \ No newline at end of file Modified: cfe/trunk/test/CodeGenCXX/mips-size_t-ptrdiff_t.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mips-size_t-ptrdiff_t.cpp?rev=238200&r1=238199&r2=238200&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/mips-size_t-ptrdiff_t.cpp (original) +++ cfe/trunk/test/CodeGenCXX/mips-size_t-ptrdiff_t.cpp Tue May 26 08:30:54 2015 @@ -10,10 +10,10 @@ long *alloc_long() { return rv; } // O32-LABEL: define i32* @_Z10alloc_longv() -// O32: call noalias i8* @_Znwj(i32 zeroext 4) +// O32: call noalias i8* @_Znwj(i32 signext 4) // N32-LABEL: define i32* @_Z10alloc_longv() -// N32: call noalias i8* @_Znwj(i32 zeroext 4) +// N32: call noalias i8* @_Znwj(i32 signext 4) // N64-LABEL: define i64* @_Z10alloc_longv() // N64: call noalias i8* @_Znwm(i64 zeroext 8) @@ -24,10 +24,10 @@ long *alloc_long_array() { } // O32-LABEL: define i32* @_Z16alloc_long_arrayv() -// O32: call noalias i8* @_Znaj(i32 zeroext 8) +// O32: call noalias i8* @_Znaj(i32 signext 8) // N32-LABEL: define i32* @_Z16alloc_long_arrayv() -// N32: call noalias i8* @_Znaj(i32 zeroext 8) +// N32: call noalias i8* @_Znaj(i32 signext 8) // N64-LABEL: define i64* @_Z16alloc_long_arrayv() // N64: call noalias i8* @_Znam(i64 zeroext 16) _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
