diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index c1d0d3bcdb1..06ee5a8257e 100644 --- a/lib/Transforms/IPO/GlobalOpt.cpp +++ b/lib/Transforms/IPO/GlobalOpt.cpp @@ -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(CurInst)) { + InstResult = ConstantExpr::getExtractValue( + getVal(EVI->getAggregateOperand()), EVI->getIndices()); + DEBUG(dbgs() << "Found an ExtractValueInst! Simplifying: " << *InstResult + << "\n"); + } else if (auto *IVI = dyn_cast(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(CurInst)) { Constant *P = getVal(GEP->getOperand(0)); SmallVector GEPOps; diff --git a/test/Transforms/GlobalOpt/constantfold-initializers.ll b/test/Transforms/GlobalOpt/constantfold-initializers.ll index 4a25d661edc..36de19c1cd8 100644 --- a/test/Transforms/GlobalOpt/constantfold-initializers.ll +++ b/test/Transforms/GlobalOpt/constantfold-initializers.ll @@ -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 }]