mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-26 23:32:58 +00:00
IR: Fix a missed case when threading OnlyIfReduced through ConstantExpr
In r216015 I missed propagating `OnlyIfReduced` through the inline versions of `getGetElementPtr()` (I was relying on compile failures on mismatches between the header and source signatures to get them all). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216023 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
13f5c5896d
commit
8db4ddb14a
@ -1036,9 +1036,9 @@ public:
|
||||
static Constant *getGetElementPtr(Constant *C, ArrayRef<Constant *> IdxList,
|
||||
bool InBounds = false,
|
||||
Type *OnlyIfReducedTy = nullptr) {
|
||||
return getGetElementPtr(C, makeArrayRef((Value * const *)IdxList.data(),
|
||||
IdxList.size()),
|
||||
InBounds);
|
||||
return getGetElementPtr(
|
||||
C, makeArrayRef((Value * const *)IdxList.data(), IdxList.size()),
|
||||
InBounds, OnlyIfReducedTy);
|
||||
}
|
||||
static Constant *getGetElementPtr(Constant *C, Constant *Idx,
|
||||
bool InBounds = false,
|
||||
@ -1046,7 +1046,7 @@ public:
|
||||
// This form of the function only exists to avoid ambiguous overload
|
||||
// warnings about whether to convert Idx to ArrayRef<Constant *> or
|
||||
// ArrayRef<Value *>.
|
||||
return getGetElementPtr(C, cast<Value>(Idx), InBounds);
|
||||
return getGetElementPtr(C, cast<Value>(Idx), InBounds, OnlyIfReducedTy);
|
||||
}
|
||||
static Constant *getGetElementPtr(Constant *C, ArrayRef<Value *> IdxList,
|
||||
bool InBounds = false,
|
||||
|
@ -322,5 +322,30 @@ TEST(ConstantsTest, ConstantExprReplaceWithConstant) {
|
||||
ASSERT_EQ(Int2, Ref->getInitializer());
|
||||
}
|
||||
|
||||
TEST(ConstantsTest, GEPReplaceWithConstant) {
|
||||
LLVMContext Context;
|
||||
std::unique_ptr<Module> M(new Module("MyModule", Context));
|
||||
|
||||
Type *IntTy = Type::getInt32Ty(Context);
|
||||
Type *PtrTy = PointerType::get(IntTy, 0);
|
||||
auto *C1 = ConstantInt::get(IntTy, 1);
|
||||
auto *Placeholder = new GlobalVariable(
|
||||
*M, IntTy, false, GlobalValue::ExternalWeakLinkage, nullptr);
|
||||
auto *GEP = ConstantExpr::getGetElementPtr(Placeholder, C1);
|
||||
ASSERT_EQ(GEP->getOperand(0), Placeholder);
|
||||
|
||||
auto *Ref =
|
||||
new GlobalVariable(*M, PtrTy, false, GlobalValue::ExternalLinkage, GEP);
|
||||
ASSERT_EQ(GEP, Ref->getInitializer());
|
||||
|
||||
auto *Global = new GlobalVariable(*M, PtrTy, false,
|
||||
GlobalValue::ExternalLinkage, nullptr);
|
||||
auto *Alias = GlobalAlias::create(IntTy, 0, GlobalValue::ExternalLinkage,
|
||||
"alias", Global, M.get());
|
||||
Placeholder->replaceAllUsesWith(Alias);
|
||||
ASSERT_EQ(GEP, Ref->getInitializer());
|
||||
ASSERT_EQ(GEP->getOperand(0), Alias);
|
||||
}
|
||||
|
||||
} // end anonymous namespace
|
||||
} // end namespace llvm
|
||||
|
Loading…
x
Reference in New Issue
Block a user