From 7dac027ed7513f330567f3ae67e70ee13c7e34a5 Mon Sep 17 00:00:00 2001 From: Davide Italiano Date: Thu, 14 Jul 2016 02:51:41 +0000 Subject: [PATCH] [IPSCCP] Constant fold struct argument/instructions when all the lattice values are constant. This now should also work with the interprocedural variant of the pass. Slightly easier now that the yak is shaved. Differential Revision: http://reviews.llvm.org/D22329 llvm-svn: 275363 --- llvm/lib/Transforms/Scalar/SCCP.cpp | 13 +++---------- llvm/test/Transforms/SCCP/ipsccp-basic.ll | 15 ++++++++++++--- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp index 02ffad47beee..61905a342467 100644 --- a/llvm/lib/Transforms/Scalar/SCCP.cpp +++ b/llvm/lib/Transforms/Scalar/SCCP.cpp @@ -1766,11 +1766,8 @@ static bool runIPSCCP(Module &M, const DataLayout &DL, if (Solver.isBlockExecutable(&F.front())) { for (Function::arg_iterator AI = F.arg_begin(), E = F.arg_end(); AI != E; ++AI) { - if (AI->use_empty() || AI->getType()->isStructTy()) continue; - - // TODO: Could use getStructLatticeValueFor to find out if the entire - // result is a constant and replace it entirely if so. - + if (AI->use_empty()) + continue; if (tryToReplaceWithConstant(Solver, &*AI)) ++IPNumArgsElimed; } @@ -1793,12 +1790,8 @@ static bool runIPSCCP(Module &M, const DataLayout &DL, for (BasicBlock::iterator BI = BB->begin(), E = BB->end(); BI != E; ) { Instruction *Inst = &*BI++; - if (Inst->getType()->isVoidTy() || Inst->getType()->isStructTy()) + if (Inst->getType()->isVoidTy()) continue; - - // TODO: Could use getStructLatticeValueFor to find out if the entire - // result is a constant and replace it entirely if so. - if (tryToReplaceInstWithConstant( Solver, Inst, !isa(Inst) && diff --git a/llvm/test/Transforms/SCCP/ipsccp-basic.ll b/llvm/test/Transforms/SCCP/ipsccp-basic.ll index bf37134545ed..917aaa02acac 100644 --- a/llvm/test/Transforms/SCCP/ipsccp-basic.ll +++ b/llvm/test/Transforms/SCCP/ipsccp-basic.ll @@ -82,6 +82,10 @@ define internal {i64,i64} @test4a() { ret {i64,i64} %b } +; CHECK-LABEL: define internal { i64, i64 } @test4a( +; CHECK-NEXT: ret { i64, i64 } { i64 5, i64 4 } +; CHECK-NEXT: } + define i64 @test4b() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { %a = invoke {i64,i64} @test4a() to label %A unwind label %B @@ -130,7 +134,7 @@ B: ; CHECK: define i64 @test5b() ; CHECK: A: -; CHECK-NEXT: %c = call i64 @test5c({ i64, i64 } %a) +; CHECK-NEXT: %c = call i64 @test5c({ i64, i64 } { i64 5, i64 4 }) ; CHECK-NEXT: ret i64 5 define internal i64 @test5c({i64,i64} %a) { @@ -163,8 +167,7 @@ define internal %T @test7a(i32 %A) { %mrv1 = insertvalue %T %mrv0, i32 %A, 1 ret %T %mrv1 ; CHECK-LABEL: @test7a( -; CHECK-NEXT: %mrv0 = insertvalue %T undef, i32 18, 0 -; CHECK-NEXT: %mrv1 = insertvalue %T %mrv0, i32 17, 1 +; CHECK-NEXT: ret %T { i32 18, i32 17 } } define i32 @test7b() { @@ -208,6 +211,12 @@ entry: ret void } +; CHECK-LABEL: define void @test9( +; CHECK-NEXT: entry: +; CHECK-NEXT: %local_foo = alloca {} +; CHECK-NEXT: store {} zeroinitializer, {}* %local_foo +; CHECK-NEXT: ret void + declare i32 @__gxx_personality_v0(...) ;;======================== test10