mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-26 07:34:06 +00:00
Address a large chunk of this FIXME by accumulating the cost for
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
This commit is contained in:
parent
681add7a63
commit
47d8f6dca5
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user