mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-01 00:33:09 +00:00
GlobalOpt: Optimize in the face of insertvalue/extractvalue
GlobalOpt didn't know how to simulate InsertValueInst or ExtractValueInst. Optimizing these is pretty straightforward. N.B. This came up when looking at clang's IRGen for MS ABI member pointers; they are represented as aggregates. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215184 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2477ef9014
commit
8e5c298a17
@ -2394,6 +2394,17 @@ bool Evaluator::EvaluateBlock(BasicBlock::iterator CurInst,
|
||||
getVal(SI->getOperand(2)));
|
||||
DEBUG(dbgs() << "Found a Select! Simplifying: " << *InstResult
|
||||
<< "\n");
|
||||
} else if (auto *EVI = dyn_cast<ExtractValueInst>(CurInst)) {
|
||||
InstResult = ConstantExpr::getExtractValue(
|
||||
getVal(EVI->getAggregateOperand()), EVI->getIndices());
|
||||
DEBUG(dbgs() << "Found an ExtractValueInst! Simplifying: " << *InstResult
|
||||
<< "\n");
|
||||
} else if (auto *IVI = dyn_cast<InsertValueInst>(CurInst)) {
|
||||
InstResult = ConstantExpr::getInsertValue(
|
||||
getVal(IVI->getAggregateOperand()),
|
||||
getVal(IVI->getInsertedValueOperand()), IVI->getIndices());
|
||||
DEBUG(dbgs() << "Found an InsertValueInst! Simplifying: " << *InstResult
|
||||
<< "\n");
|
||||
} else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(CurInst)) {
|
||||
Constant *P = getVal(GEP->getOperand(0));
|
||||
SmallVector<Constant*, 8> GEPOps;
|
||||
|
@ -81,10 +81,23 @@ entry:
|
||||
ret void
|
||||
}
|
||||
|
||||
@test6_v1 = internal global { i32, i32 } { i32 42, i32 0 }, align 8
|
||||
@test6_v2 = global i32 0, align 4
|
||||
; CHECK: @test6_v2 = global i32 42, align 4
|
||||
define internal void @test6() {
|
||||
%load = load { i32, i32 }* @test6_v1, align 8
|
||||
%xv0 = extractvalue { i32, i32 } %load, 0
|
||||
%iv = insertvalue { i32, i32 } %load, i32 %xv0, 1
|
||||
%xv1 = extractvalue { i32, i32 } %iv, 1
|
||||
store i32 %xv1, i32* @test6_v2, align 4
|
||||
ret void
|
||||
}
|
||||
|
||||
@llvm.global_ctors = appending constant
|
||||
[5 x { i32, void ()* }]
|
||||
[6 x { i32, void ()* }]
|
||||
[{ i32, void ()* } { i32 65535, void ()* @test1 },
|
||||
{ i32, void ()* } { i32 65535, void ()* @test2 },
|
||||
{ i32, void ()* } { i32 65535, void ()* @test3 },
|
||||
{ i32, void ()* } { i32 65535, void ()* @test4 },
|
||||
{ i32, void ()* } { i32 65535, void ()* @test5 }]
|
||||
{ i32, void ()* } { i32 65535, void ()* @test5 },
|
||||
{ i32, void ()* } { i32 65535, void ()* @test6 }]
|
||||
|
Loading…
Reference in New Issue
Block a user