[llvm-commits] [llvm] r89479 - /llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp
Evan Cheng
evan.cheng at apple.com
Fri Nov 20 12:06:37 PST 2009
This breaks the build?
/tmp/llvmCore_Embedded.roots/llvmCore_Embedded~obj/src/lib/Transforms/Scalar/SimplifyLibCalls.cpp: In member function 'llvm::Value*<unnamed>::LibCallOptimization::EmitMemMove(llvm::Value*,\
llvm::Value*, llvm::Value*, unsigned int, llvm::IRBuilder<true, llvm::ConstantFolder, llvm::IRBuilderDefaultInserter<true> >&)':
/tmp/llvmCore_Embedded.roots/llvmCore_Embedded~obj/src/lib/Transforms/Scalar/SimplifyLibCalls.cpp:175: error: declaration of 'llvm::Value* Dst' shadows a parameter
/tmp/llvmCore_Embedded.roots/llvmCore_Embedded~obj/src/lib/Transforms/Scalar/SimplifyLibCalls.cpp:175: error: 'CI' was not declared in this scope
/tmp/llvmCore_Embedded.roots/llvmCore_Embedded~obj/src/lib/Transforms/Scalar/SimplifyLibCalls.cpp:176: error: declaration of 'llvm::Value* Src' shadows a parameter
/tmp/llvmCore_Embedded.roots/llvmCore_Embedded~obj/src/lib/Transforms/Scalar/SimplifyLibCalls.cpp:178: error: declaration of 'llvm::Value* Align' shadows a parameter
Evan
On Nov 20, 2009, at 11:57 AM, Eric Christopher wrote:
> Author: echristo
> Date: Fri Nov 20 13:57:37 2009
> New Revision: 89479
>
> URL: http://llvm.org/viewvc/llvm-project?rev=89479&view=rev
> Log:
> Add some rough optimizations for checking routines.
>
> Modified:
> llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp
>
> Modified: llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp?rev=89479&r1=89478&r2=89479&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp Fri Nov 20 13:57:37 2009
> @@ -81,6 +81,9 @@
> Value *EmitMemCpy(Value *Dst, Value *Src, Value *Len,
> unsigned Align, IRBuilder<> &B);
>
> + Value *EmitMemMove(Value *Dst, Value *Src, Value *Len,
> + unsigned Align, IRBuilder<> &B);
> +
> /// EmitMemChr - Emit a call to the memchr function. This assumes that Ptr is
> /// a pointer, Val is an i32 value, and Len is an 'intptr_t' value.
> Value *EmitMemChr(Value *Ptr, Value *Val, Value *Len, IRBuilder<> &B);
> @@ -160,6 +163,22 @@
> ConstantInt::get(Type::getInt32Ty(*Context), Align));
> }
>
> +/// EmitMemMOve - Emit a call to the memmove function to the builder. This
> +/// always expects that the size has type 'intptr_t' and Dst/Src are pointers.
> +Value *LibCallOptimization::EmitMemMove(Value *Dst, Value *Src, Value *Len,
> + unsigned Align, IRBuilder<> &B) {
> + Module *M = Caller->getParent();
> + Intrinsic::ID IID = Intrinsic::memmove;
> + const Type *Tys[1];
> + Tys[0] = TD->getIntPtrType(*Context);
> + Value *MemMove = Intrinsic::getDeclaration(M, IID, Tys, 1);
> + Value *Dst = CastToCStr(CI->getOperand(1), B);
> + Value *Src = CastToCStr(CI->getOperand(2), B);
> + Value *Size = CI->getOperand(3);
> + Value *Align = ConstantInt::get(Type::getInt32Ty(*Context), 1);
> + return B.CreateCall4(MemMove, Dst, Src, Size, Align);
> +}
> +
> /// EmitMemChr - Emit a call to the memchr function. This assumes that Ptr is
> /// a pointer, Val is an i32 value, and Len is an 'intptr_t' value.
> Value *LibCallOptimization::EmitMemChr(Value *Ptr, Value *Val,
> @@ -1010,16 +1029,7 @@
> return 0;
>
> // memmove(x, y, n) -> llvm.memmove(x, y, n, 1)
> - Module *M = Caller->getParent();
> - Intrinsic::ID IID = Intrinsic::memmove;
> - const Type *Tys[1];
> - Tys[0] = TD->getIntPtrType(*Context);
> - Value *MemMove = Intrinsic::getDeclaration(M, IID, Tys, 1);
> - Value *Dst = CastToCStr(CI->getOperand(1), B);
> - Value *Src = CastToCStr(CI->getOperand(2), B);
> - Value *Size = CI->getOperand(3);
> - Value *Align = ConstantInt::get(Type::getInt32Ty(*Context), 1);
> - B.CreateCall4(MemMove, Dst, Src, Size, Align);
> + EmitMemMove(CI->getOperand(1), CI->getOperand(2), CI->getOperand(3), 1, B);
> return CI->getOperand(1);
> }
> };
> @@ -1048,6 +1058,96 @@
> };
>
> //===----------------------------------------------------------------------===//
> +// Object Size Checking Optimizations
> +//===----------------------------------------------------------------------===//
> +//===---------------------------------------===//
> +// 'memcpy_chk' Optimizations
> +
> +struct MemCpyChkOpt : public LibCallOptimization {
> + virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
> + // These optimizations require TargetData.
> + if (!TD) return 0;
> +
> + const FunctionType *FT = Callee->getFunctionType();
> + if (FT->getNumParams() != 4 || FT->getReturnType() != FT->getParamType(0) ||
> + !isa<PointerType>(FT->getParamType(0)) ||
> + !isa<PointerType>(FT->getParamType(1)) ||
> + !isa<IntegerType>(FT->getParamType(3)) ||
> + FT->getParamType(2) != TD->getIntPtrType(*Context))
> + return 0;
> +
> + ConstantInt *SizeCI = dyn_cast<ConstantInt>(CI->getOperand(4));
> + if (!SizeCI)
> + return 0;
> + if (SizeCI->isAllOnesValue()) {
> + EmitMemCpy(CI->getOperand(1), CI->getOperand(2), CI->getOperand(3), 1, B);
> + return CI->getOperand(1);
> + }
> +
> + return 0;
> + }
> +};
> +
> +//===---------------------------------------===//
> +// 'memset_chk' Optimizations
> +
> +struct MemSetChkOpt : public LibCallOptimization {
> + virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
> + // These optimizations require TargetData.
> + if (!TD) return 0;
> +
> + const FunctionType *FT = Callee->getFunctionType();
> + if (FT->getNumParams() != 4 || FT->getReturnType() != FT->getParamType(0) ||
> + !isa<PointerType>(FT->getParamType(0)) ||
> + !isa<IntegerType>(FT->getParamType(1)) ||
> + !isa<IntegerType>(FT->getParamType(3)) ||
> + FT->getParamType(2) != TD->getIntPtrType(*Context))
> + return 0;
> +
> + ConstantInt *SizeCI = dyn_cast<ConstantInt>(CI->getOperand(4));
> + if (!SizeCI)
> + return 0;
> + if (SizeCI->isAllOnesValue()) {
> + Value *Val = B.CreateIntCast(CI->getOperand(2), Type::getInt8Ty(*Context),
> + false);
> + EmitMemSet(CI->getOperand(1), Val, CI->getOperand(3), B);
> + return CI->getOperand(1);
> + }
> +
> + return 0;
> + }
> +};
> +
> +//===---------------------------------------===//
> +// 'memmove_chk' Optimizations
> +
> +struct MemMoveChkOpt : public LibCallOptimization {
> + virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
> + // These optimizations require TargetData.
> + if (!TD) return 0;
> +
> + const FunctionType *FT = Callee->getFunctionType();
> + if (FT->getNumParams() != 4 || FT->getReturnType() != FT->getParamType(0) ||
> + !isa<PointerType>(FT->getParamType(0)) ||
> + !isa<PointerType>(FT->getParamType(1)) ||
> + !isa<IntegerType>(FT->getParamType(3)) ||
> + FT->getParamType(2) != TD->getIntPtrType(*Context))
> + return 0;
> +
> + ConstantInt *SizeCI = dyn_cast<ConstantInt>(CI->getOperand(4));
> + if (!SizeCI)
> + return 0;
> + if (SizeCI->isAllOnesValue()) {
> + EmitMemMove(CI->getOperand(1), CI->getOperand(2), CI->getOperand(3),
> + 1, B);
> + return CI->getOperand(1);
> + }
> +
> + return 0;
> + }
> +};
> +
> +//===----------------------------------------------------------------------===//
> // Math Library Optimizations
> //===----------------------------------------------------------------------===//
>
> @@ -1586,7 +1686,10 @@
> // Formatting and IO Optimizations
> SPrintFOpt SPrintF; PrintFOpt PrintF;
> FWriteOpt FWrite; FPutsOpt FPuts; FPrintFOpt FPrintF;
> +
> + // Object Size Checking
> SizeOpt ObjectSize;
> + MemCpyChkOpt MemCpyChk; MemSetChkOpt MemSetChk; MemMoveChkOpt MemMoveChk;
>
> bool Modified; // This is only used by doInitialization.
> public:
> @@ -1693,8 +1796,12 @@
> Optimizations["fputs"] = &FPuts;
> Optimizations["fprintf"] = &FPrintF;
>
> - // Miscellaneous
> - Optimizations["llvm.objectsize"] = &ObjectSize;
> + // Object Size Checking
> + Optimizations["llvm.objectsize.i32"] = &ObjectSize;
> + Optimizations["llvm.objectsize.i64"] = &ObjectSize;
> + Optimizations["__memcpy_chk"] = &MemCpyChk;
> + Optimizations["__memset_chk"] = &MemSetChk;
> + Optimizations["__memmove_chk"] = &MemMoveChk;
> }
>
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list