From db9654e284a8493db7ddf66ddd0c089d1eff7b85 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 25 Mar 2007 20:43:09 +0000 Subject: [PATCH] implement Transforms/InstCombine/cast2.ll:test3 and PR1263 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35341 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Scalar/InstructionCombining.cpp | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index c1a0fefccfc..fd2c304e993 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -7896,10 +7896,22 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) { if (GEP.getNumOperands() == 2 && HasZeroPointerIndex) return ReplaceInstUsesWith(GEP, PtrOp); + // Keep track of whether all indices are zero constants integers. + bool AllZeroIndices = true; + // Eliminate unneeded casts for indices. bool MadeChange = false; + gep_type_iterator GTI = gep_type_begin(GEP); - for (unsigned i = 1, e = GEP.getNumOperands(); i != e; ++i, ++GTI) + for (unsigned i = 1, e = GEP.getNumOperands(); i != e; ++i, ++GTI) { + // Track whether this GEP has all zero indices, if so, it doesn't move the + // input pointer, it just changes its type. + if (AllZeroIndices) { + if (ConstantInt *CI = dyn_cast(GEP.getOperand(i))) + AllZeroIndices = CI->isNullValue(); + else + AllZeroIndices = false; + } if (isa(*GTI)) { if (CastInst *CI = dyn_cast(GEP.getOperand(i))) { if (CI->getOpcode() == Instruction::ZExt || @@ -7929,8 +7941,16 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) { MadeChange = true; } } + } if (MadeChange) return &GEP; + // If this GEP instruction doesn't move the pointer, and if the input operand + // is a bitcast of another pointer, just replace the GEP with a bitcast of the + // real input to the dest type. + if (AllZeroIndices && isa(GEP.getOperand(0))) + return new BitCastInst(cast(GEP.getOperand(0))->getOperand(0), + GEP.getType()); + // Combine Indices - If the source pointer to this getelementptr instruction // is a getelementptr instruction, combine the indices of the two // getelementptr instructions into a single instruction. -- 2.34.1