mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
IR: Fix ConstantExpr::replaceUsesOfWithOnConstant()
Change `ConstantExpr` to follow the model the other constants are using: only malloc a replacement if it's going to be used. This fixes a subtle bug where if an API user had used `ConstantExpr::get()` already to create the replacement but hadn't given it any users, we'd delete the replacement. This relies on r216015 to thread `OnlyIfReduced` through `ConstantExpr::getWithOperands()`. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216016 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -299,5 +299,28 @@ TEST(ConstantsTest, ConstantArrayReplaceWithConstant) {
|
||||
ASSERT_EQ(A01, RefArray->getInitializer());
|
||||
}
|
||||
|
||||
TEST(ConstantsTest, ConstantExprReplaceWithConstant) {
|
||||
LLVMContext Context;
|
||||
std::unique_ptr<Module> M(new Module("MyModule", Context));
|
||||
|
||||
Type *IntTy = Type::getInt8Ty(Context);
|
||||
Constant *G1 = new GlobalVariable(*M, IntTy, false,
|
||||
GlobalValue::ExternalLinkage, nullptr);
|
||||
Constant *G2 = new GlobalVariable(*M, IntTy, false,
|
||||
GlobalValue::ExternalLinkage, nullptr);
|
||||
ASSERT_NE(G1, G2);
|
||||
|
||||
Constant *Int1 = ConstantExpr::getPtrToInt(G1, IntTy);
|
||||
Constant *Int2 = ConstantExpr::getPtrToInt(G2, IntTy);
|
||||
ASSERT_NE(Int1, Int2);
|
||||
|
||||
GlobalVariable *Ref =
|
||||
new GlobalVariable(*M, IntTy, false, GlobalValue::ExternalLinkage, Int1);
|
||||
ASSERT_EQ(Int1, Ref->getInitializer());
|
||||
|
||||
G1->replaceAllUsesWith(G2);
|
||||
ASSERT_EQ(Int2, Ref->getInitializer());
|
||||
}
|
||||
|
||||
} // end anonymous namespace
|
||||
} // end namespace llvm
|
||||
|
Reference in New Issue
Block a user