[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
This commit is contained in:
Davide Italiano 2016-07-14 02:51:41 +00:00
parent 622ef17f5d
commit 7dac027ed7
2 changed files with 15 additions and 13 deletions

View File

@ -1766,11 +1766,8 @@ static bool runIPSCCP(Module &M, const DataLayout &DL,
if (Solver.isBlockExecutable(&F.front())) { if (Solver.isBlockExecutable(&F.front())) {
for (Function::arg_iterator AI = F.arg_begin(), E = F.arg_end(); AI != E; for (Function::arg_iterator AI = F.arg_begin(), E = F.arg_end(); AI != E;
++AI) { ++AI) {
if (AI->use_empty() || AI->getType()->isStructTy()) continue; if (AI->use_empty())
continue;
// TODO: Could use getStructLatticeValueFor to find out if the entire
// result is a constant and replace it entirely if so.
if (tryToReplaceWithConstant(Solver, &*AI)) if (tryToReplaceWithConstant(Solver, &*AI))
++IPNumArgsElimed; ++IPNumArgsElimed;
} }
@ -1793,12 +1790,8 @@ static bool runIPSCCP(Module &M, const DataLayout &DL,
for (BasicBlock::iterator BI = BB->begin(), E = BB->end(); BI != E; ) { for (BasicBlock::iterator BI = BB->begin(), E = BB->end(); BI != E; ) {
Instruction *Inst = &*BI++; Instruction *Inst = &*BI++;
if (Inst->getType()->isVoidTy() || Inst->getType()->isStructTy()) if (Inst->getType()->isVoidTy())
continue; continue;
// TODO: Could use getStructLatticeValueFor to find out if the entire
// result is a constant and replace it entirely if so.
if (tryToReplaceInstWithConstant( if (tryToReplaceInstWithConstant(
Solver, Inst, Solver, Inst,
!isa<CallInst>(Inst) && !isa<CallInst>(Inst) &&

View File

@ -82,6 +82,10 @@ define internal {i64,i64} @test4a() {
ret {i64,i64} %b 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*) { define i64 @test4b() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
%a = invoke {i64,i64} @test4a() %a = invoke {i64,i64} @test4a()
to label %A unwind label %B to label %A unwind label %B
@ -130,7 +134,7 @@ B:
; CHECK: define i64 @test5b() ; CHECK: define i64 @test5b()
; CHECK: A: ; 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 ; CHECK-NEXT: ret i64 5
define internal i64 @test5c({i64,i64} %a) { define internal i64 @test5c({i64,i64} %a) {
@ -163,8 +167,7 @@ define internal %T @test7a(i32 %A) {
%mrv1 = insertvalue %T %mrv0, i32 %A, 1 %mrv1 = insertvalue %T %mrv0, i32 %A, 1
ret %T %mrv1 ret %T %mrv1
; CHECK-LABEL: @test7a( ; CHECK-LABEL: @test7a(
; CHECK-NEXT: %mrv0 = insertvalue %T undef, i32 18, 0 ; CHECK-NEXT: ret %T { i32 18, i32 17 }
; CHECK-NEXT: %mrv1 = insertvalue %T %mrv0, i32 17, 1
} }
define i32 @test7b() { define i32 @test7b() {
@ -208,6 +211,12 @@ entry:
ret void 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(...) declare i32 @__gxx_personality_v0(...)
;;======================== test10 ;;======================== test10