[PATCH] D24088: Create a getelementptr instead of sub expr for ValueOffsetPair if the value is a pointer
Wei Mi via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 14 11:02:17 PDT 2016
wmi updated this revision to Diff 71398.
wmi added a comment.
Herald added a subscriber: sanjoy.
Create a C++ unittest to exercise the branch where the offset is not divisible by the elem type size of value.
Repository:
rL LLVM
https://reviews.llvm.org/D24088
Files:
unittests/Analysis/ScalarEvolutionTest.cpp
Index: unittests/Analysis/ScalarEvolutionTest.cpp
===================================================================
--- unittests/Analysis/ScalarEvolutionTest.cpp
+++ unittests/Analysis/ScalarEvolutionTest.cpp
@@ -7,6 +7,7 @@
//
//===----------------------------------------------------------------------===//
+#include "llvm/Analysis/ScalarEvolutionExpander.h"
#include "llvm/Analysis/ScalarEvolutionExpressions.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/LoopInfo.h"
@@ -264,5 +265,71 @@
EXPECT_EQ(S1, S2);
}
+TEST_F(ScalarEvolutionsTest, ExpandPtrTypeSCEV) {
+ // It is to test the fix for PR30213. It exercises the branch in scev
+ // expansion when the value in ValueOffsetPair is a ptr and the offset
+ // is not divisible by the elem type size of value.
+ auto *I8Ty = Type::getInt8Ty(Context);
+ auto *I8PtrTy = Type::getInt8PtrTy(Context);
+ auto *I32Ty = Type::getInt32Ty(Context);
+ auto *I32PtrTy = Type::getInt32PtrTy(Context);
+ FunctionType *FTy =
+ FunctionType::get(Type::getVoidTy(Context), std::vector<Type *>(), false);
+ Function *F = cast<Function>(M.getOrInsertFunction("f", FTy));
+ BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
+ BasicBlock *LoopBB = BasicBlock::Create(Context, "loop", F);
+ BasicBlock *ExitBB = BasicBlock::Create(Context, "exit", F);
+ BranchInst::Create(LoopBB, EntryBB);
+ ReturnInst::Create(Context, nullptr, ExitBB);
+
+ // loop: ; preds = %loop, %entry
+ // %alloca = alloca i32
+ // %gep0 = getelementptr i32, i32* %alloca, i32 1
+ // %bitcast1 = bitcast i32* %gep0 to i8*
+ // %gep1 = getelementptr i8, i8* %bitcast1, i32 1
+ // %gep2 = getelementptr i8, i8* undef, i32 1
+ // %cmp = icmp ult i8* undef, %bitcast1
+ // %select = select i1 %cmp, i8* %gep1, i8* %gep2
+ // %bitcase2 = bitcast i8* %select to i32*
+ // br i1 undef, label %loop, label %exit
+
+ BranchInst *Br = BranchInst::Create(
+ LoopBB, ExitBB, UndefValue::get(Type::getInt1Ty(Context)), LoopBB);
+ AllocaInst *Alloca = new AllocaInst(I32Ty, "alloca", Br);
+ ConstantInt *Ci32 = ConstantInt::get(Context, APInt(32, 1));
+ GetElementPtrInst *Gep0 =
+ GetElementPtrInst::Create(I32Ty, Alloca, Ci32, "gep0", Br);
+ CastInst *Casta =
+ CastInst::CreateBitOrPointerCast(Gep0, I8PtrTy, "bitcast1", Br);
+ GetElementPtrInst *Gep1 =
+ GetElementPtrInst::Create(I8Ty, Casta, Ci32, "gep1", Br);
+ GetElementPtrInst *Gep2 = GetElementPtrInst::Create(
+ I8Ty, UndefValue::get(I8PtrTy), Ci32, "gep2", Br);
+ CmpInst *Cmp = CmpInst::Create(Instruction::ICmp, CmpInst::ICMP_ULT,
+ UndefValue::get(I8PtrTy), Casta, "cmp", Br);
+ SelectInst *Sel = SelectInst::Create(Cmp, Gep1, Gep2, "select", Br);
+ CastInst *Castb =
+ CastInst::CreateBitOrPointerCast(Sel, I32PtrTy, "bitcase2", Br);
+
+ ScalarEvolution SE = buildSE(*F);
+ auto *S = SE.getSCEV(Castb);
+ SCEVExpander Exp(SE, M.getDataLayout(), "expander");
+ Value *V =
+ Exp.expandCodeFor(cast<SCEVAddExpr>(S)->getOperand(1), nullptr, Br);
+
+ // Expect the expansion code contains:
+ // %0 = bitcast i32* %bitcase2 to i8*
+ // %uglygep = getelementptr i8, i8* %0, i64 -1
+ // %1 = bitcast i8* %uglygep to i32*
+ BitCastInst *Exp2 = dyn_cast<BitCastInst>(V);
+ GetElementPtrInst *Exp1 = dyn_cast<GetElementPtrInst>(Exp2->getPrevNode());
+ ConstantInt *Cint = dyn_cast<ConstantInt>(Exp1->getOperand(1));
+ EXPECT_NE(dyn_cast<BitCastInst>(Exp1->getPrevNode()), nullptr);
+ EXPECT_NE(Exp1, nullptr);
+ EXPECT_NE(Cint, nullptr);
+ EXPECT_EQ(Cint->getSExtValue(), -1);
+ EXPECT_NE(Exp2, nullptr);
+}
+
} // end anonymous namespace
} // end namespace llvm
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D24088.71398.patch
Type: text/x-patch
Size: 3742 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160914/d53e145c/attachment.bin>
More information about the llvm-commits
mailing list