I used &Idx[0]. In future, please avoid tabs in your patch.
I applied your patch.
http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20071217/056403.html
-
Devang
On Dec 17, 2007, at 2:57 AM, Richard Pennington wrote:
> Devang Patel wrote:
>> On Dec 15, 2007, at 12:15 PM, Richard Pennington wrote:
>>> I got the current version of LLVM via svn yesterday and modified
>>> my code to
>>> use the LLVMFoldingBuilder. Very nice!
>>>
>>> My question is this: I noticed that the folding builder doesn't
>>> fold some
>>> operations, e.g. casts. Is there some reason why? If I
>>> implemented some of
>>> these unhandled cases could I sumbit the changes back to the LLVM
>>> project?
>> Sure. Though, I do not exactly understand what do you mean by
>> folding casts operations, we encourage patches to improve
>> LLVMFoldingBuilder!
>> -
>> Devang
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
> Hi Devang,
>
> Folding a cast is like folding any other operator: If the operand is
> constant, the cast can be done at compile time. I've made the
> necessary changes to LLVMFoldingBuilder.h to handle casts and
> several other operators.
>
> I have attached the patch. There is one glaring thing that should be
> addressed. The #ifdef RICH around code in CreateGEP is there because
> I'm not familiar with STL enough to figure out how to get an array
> of pointers out of a vector. :-( If someone could clue me in as to
> the best way to do this, I'd greatly appreciate it.
>
> I've tested this code with my Elsa->LLVM stuff and also recompiled
> the LLVM itself, so I'm pretty confident that the patch doesn't
> break anything.
>
> Since this is my first patch to LLVM and I've only been using LLVM
> for two weeks, please be gentle with me. If I made any glaring
> submission errors, I'll gladly fix them.
>
> -Rich
> Index: include/llvm/Support/LLVMBuilder.h
> ==================================================================> ---
include/llvm/Support/LLVMBuilder.h (revision 505)
> +++ include/llvm/Support/LLVMBuilder.h (working copy)
> @@ -538,6 +538,95 @@
> }
>
> //
> =
> =
> =--------------------------------------------------------------------
> ===//
> + // Instruction creation methods: Memory Instructions
> + //
> =
> =
> =--------------------------------------------------------------------
> ===//
> +
> + template<typename InputIterator>
> + Value *CreateGEP(Value *Ptr, InputIterator IdxBegin,
> + InputIterator IdxEnd, const char
> *Name = "") {
> +#if RICH
> + if (Constant *PC = dyn_cast<Constant>(Ptr)) {
> + // Every index must be constant.
> + InputIterator i;
> + for (i = IdxBegin; i < IdxEnd; ++i) {
> + if (!dyn_cast<Constant>(*i)) {
> + break;
> + }
> + }
> + if (i == IdxEnd) {
> + return ConstantExpr::getGetElementPtr(PC, &IdxBegin,
> IdxEnd - IdxBegin);
> + }
> + }
> +#endif
> + return LLVMBuilder::CreateGEP(Ptr, IdxBegin, IdxEnd, Name);
> + }
> + Value *CreateGEP(Value *Ptr, Value *Idx, const char *Name =
"") {
> + if (Constant *PC = dyn_cast<Constant>(Ptr))
> + if (Constant *IC = dyn_cast<Constant>(Idx))
> + return ConstantExpr::getGetElementPtr(PC, &IC, 1);
> + return LLVMBuilder::CreateGEP(Ptr, Idx, Name);
> + }
> +
> + //
> =
> =
> =--------------------------------------------------------------------
> ===//
> + // Instruction creation methods: Cast/Conversion Operators
> + //
> =
> =
> =--------------------------------------------------------------------
> ===//
> +
> + Value *CreateTrunc(Value *V, const Type *DestTy, const char *Name
> = "") {
> + return CreateCast(Instruction::Trunc, V, DestTy, Name);
> + }
> + Value *CreateZExt(Value *V, const Type *DestTy, const char *Name
> = "") {
> + return CreateCast(Instruction::ZExt, V, DestTy, Name);
> + }
> + Value *CreateSExt(Value *V, const Type *DestTy, const char *Name
> = "") {
> + return CreateCast(Instruction::SExt, V, DestTy, Name);
> + }
> + Value *CreateFPToUI(Value *V, const Type *DestTy, const char
> *Name = ""){
> + return CreateCast(Instruction::FPToUI, V, DestTy, Name);
> + }
> + Value *CreateFPToSI(Value *V, const Type *DestTy, const char
> *Name = ""){
> + return CreateCast(Instruction::FPToSI, V, DestTy, Name);
> + }
> + Value *CreateUIToFP(Value *V, const Type *DestTy, const char
> *Name = ""){
> + return CreateCast(Instruction::UIToFP, V, DestTy, Name);
> + }
> + Value *CreateSIToFP(Value *V, const Type *DestTy, const char
> *Name = ""){
> + return CreateCast(Instruction::SIToFP, V, DestTy, Name);
> + }
> + Value *CreateFPTrunc(Value *V, const Type *DestTy,
> + const char *Name = "") {
> + return CreateCast(Instruction::FPTrunc, V, DestTy, Name);
> + }
> + Value *CreateFPExt(Value *V, const Type *DestTy, const char *Name
> = "") {
> + return CreateCast(Instruction::FPExt, V, DestTy, Name);
> + }
> + Value *CreatePtrToInt(Value *V, const Type *DestTy,
> + const char *Name = "") {
> + return CreateCast(Instruction::PtrToInt, V, DestTy, Name);
> + }
> + Value *CreateIntToPtr(Value *V, const Type *DestTy,
> + const char *Name = "") {
> + return CreateCast(Instruction::IntToPtr, V, DestTy, Name);
> + }
> + Value *CreateBitCast(Value *V, const Type *DestTy,
> + const char *Name = "") {
> + return CreateCast(Instruction::BitCast, V, DestTy, Name);
> + }
> +
> + Value *CreateCast(Instruction::CastOps Op, Value *V, const Type
> *DestTy,
> + const char *Name = "") {
> + if (Constant *VC = dyn_cast<Constant>(V))
> + return ConstantExpr::getCast(Op, VC, DestTy);
> + return LLVMBuilder::CreateCast(Op, V, DestTy, Name);
> + }
> + Value *CreateIntCast(Value *V, const Type *DestTy, bool isSigned,
> + const char *Name = "") {
> + if (Constant *VC = dyn_cast<Constant>(V))
> + return ConstantExpr::getIntegerCast(VC, DestTy, isSigned);
> + return LLVMBuilder::CreateIntCast(V, DestTy, isSigned, Name);
> + }
> +
> +
> + //
> =
> =
> =--------------------------------------------------------------------
> ===//
> // Instruction creation methods: Compare Instructions
> //
> =
> =
> =--------------------------------------------------------------------
> ===//
>
> @@ -630,6 +719,45 @@
> return ConstantExpr::getCompare(P, LC, RC);
> return LLVMBuilder::CreateFCmp(P, LHS, RHS, Name);
> }
> +
> + //
> =
> =
> =--------------------------------------------------------------------
> ===//
> + // Instruction creation methods: Other Instructions
> + //
> =
> =
> =--------------------------------------------------------------------
> ===//
> +
> + Value *CreateSelect(Value *C, Value *True, Value *False,
> + const char *Name = "") {
> + if (Constant *CC = dyn_cast<Constant>(C))
> + if (Constant *TC = dyn_cast<Constant>(True))
> + if (Constant *FC = dyn_cast<Constant>(False))
> + return ConstantExpr::getSelect(CC, TC, FC);
> + return LLVMBuilder::CreateSelect(C, True, False, Name);
> + }
> +
> + Value *CreateExtractElement(Value *Vec, Value *Idx,
> + const char *Name =
"") {
> + if (Constant *VC = dyn_cast<Constant>(Vec))
> + if (Constant *IC = dyn_cast<Constant>(Idx))
> + return ConstantExpr::getExtractElement(VC, IC);
> + return LLVMBuilder::CreateExtractElement(Vec, Idx, Name);
> + }
> +
> + Value *CreateInsertElement(Value *Vec, Value *NewElt, Value *Idx,
> + const char *Name = "")
{
> + if (Constant *VC = dyn_cast<Constant>(Vec))
> + if (Constant *NC = dyn_cast<Constant>(NewElt))
> + if (Constant *IC = dyn_cast<Constant>(Idx))
> + return ConstantExpr::getInsertElement(VC, NC, IC);
> + return LLVMBuilder::CreateInsertElement(Vec, NewElt, Idx, Name);
> + }
> +
> + Value *CreateShuffleVector(Value *V1, Value *V2, Value *Mask,
> + const char *Name = "")
{
> + if (Constant *V1C = dyn_cast<Constant>(V1))
> + if (Constant *V2C = dyn_cast<Constant>(V2))
> + if (Constant *MC = dyn_cast<Constant>(Mask))
> + return ConstantExpr::getShuffleVector(V1C, V2C, MC);
> + return LLVMBuilder::CreateShuffleVector(V1, V2, Mask, Name);
> + }
> };
>
> }
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
-
Devang