Skip to content

Commit

Permalink
Address a large chunk of this FIXME by accumulating the cost for
Browse files Browse the repository at this point in the history
unfolded constant expressions rather than checking each one
independently.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173341 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
chandlerc committed Jan 24, 2013
1 parent 681add7 commit 47d8f6d
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 8 deletions.
14 changes: 6 additions & 8 deletions lib/Transforms/Utils/SimplifyCFG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1446,14 +1446,12 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB) {
if (Operator::getOpcode(CE) == Instruction::Select)
return false;

// An unfolded ConstantExpr could end up getting expanded into
// Instructions. Don't speculate this and another instruction at
// the same time.
// FIXME: This is strange because provided we haven't already hit the cost
// of 1, this code will speculate an arbitrary number of complex constant
// expression PHI nodes. Also, this doesn't account for how complex the
// constant expression is.
if (SpeculationCost > 0)
// Account for the cost of an unfolded ConstantExpr which could end up
// getting expanded into Instructions.
// FIXME: This doesn't account for how many operations are combined in the
// constant expression.
++SpeculationCost;
if (SpeculationCost > 1)
return false;
}

Expand Down
42 changes: 42 additions & 0 deletions test/Transforms/SimplifyCFG/SpeculativeExec.ll
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,45 @@ end:

ret i8* %x
}

define i8* @test4(i1* %dummy, i8* %a, i8* %b) {
; Test that we don't speculate an arbitrarily large number of unfolded constant
; expressions.
; CHECK: @test4

entry:
%cond1 = load volatile i1* %dummy
br i1 %cond1, label %if, label %end

if:
%cond2 = load volatile i1* %dummy
br i1 %cond2, label %then, label %end

then:
br label %end

end:
%x1 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 1 to i8*), %then ]
%x2 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 2 to i8*), %then ]
%x3 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 3 to i8*), %then ]
%x4 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 4 to i8*), %then ]
%x5 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 5 to i8*), %then ]
%x6 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 6 to i8*), %then ]
%x7 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 7 to i8*), %then ]
%x8 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 8 to i8*), %then ]
%x9 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 9 to i8*), %then ]
%x10 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 10 to i8*), %then ]
; CHECK-NOT: select
; CHECK: phi i8*
; CHECK: phi i8*
; CHECK: phi i8*
; CHECK: phi i8*
; CHECK: phi i8*
; CHECK: phi i8*
; CHECK: phi i8*
; CHECK: phi i8*
; CHECK: phi i8*
; CHECK: phi i8*

ret i8* %x10
}

0 comments on commit 47d8f6d

Please sign in to comment.