mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
Have InlineCost check constant fcmps
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186758 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6cc16a0479
commit
ff29d235ed
@ -124,7 +124,7 @@ class CallAnalyzer : public InstVisitor<CallAnalyzer, bool> {
|
|||||||
bool visitIntToPtr(IntToPtrInst &I);
|
bool visitIntToPtr(IntToPtrInst &I);
|
||||||
bool visitCastInst(CastInst &I);
|
bool visitCastInst(CastInst &I);
|
||||||
bool visitUnaryInstruction(UnaryInstruction &I);
|
bool visitUnaryInstruction(UnaryInstruction &I);
|
||||||
bool visitICmp(ICmpInst &I);
|
bool visitCmpInst(CmpInst &I);
|
||||||
bool visitSub(BinaryOperator &I);
|
bool visitSub(BinaryOperator &I);
|
||||||
bool visitBinaryOperator(BinaryOperator &I);
|
bool visitBinaryOperator(BinaryOperator &I);
|
||||||
bool visitLoad(LoadInst &I);
|
bool visitLoad(LoadInst &I);
|
||||||
@ -490,7 +490,7 @@ bool CallAnalyzer::visitUnaryInstruction(UnaryInstruction &I) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CallAnalyzer::visitICmp(ICmpInst &I) {
|
bool CallAnalyzer::visitCmpInst(CmpInst &I) {
|
||||||
Value *LHS = I.getOperand(0), *RHS = I.getOperand(1);
|
Value *LHS = I.getOperand(0), *RHS = I.getOperand(1);
|
||||||
// First try to handle simplified comparisons.
|
// First try to handle simplified comparisons.
|
||||||
if (!isa<Constant>(LHS))
|
if (!isa<Constant>(LHS))
|
||||||
@ -499,12 +499,16 @@ bool CallAnalyzer::visitICmp(ICmpInst &I) {
|
|||||||
if (!isa<Constant>(RHS))
|
if (!isa<Constant>(RHS))
|
||||||
if (Constant *SimpleRHS = SimplifiedValues.lookup(RHS))
|
if (Constant *SimpleRHS = SimplifiedValues.lookup(RHS))
|
||||||
RHS = SimpleRHS;
|
RHS = SimpleRHS;
|
||||||
if (Constant *CLHS = dyn_cast<Constant>(LHS))
|
if (Constant *CLHS = dyn_cast<Constant>(LHS)) {
|
||||||
if (Constant *CRHS = dyn_cast<Constant>(RHS))
|
if (Constant *CRHS = dyn_cast<Constant>(RHS))
|
||||||
if (Constant *C = ConstantExpr::getICmp(I.getPredicate(), CLHS, CRHS)) {
|
if (Constant *C = ConstantExpr::getCompare(I.getPredicate(), CLHS, CRHS)) {
|
||||||
SimplifiedValues[&I] = C;
|
SimplifiedValues[&I] = C;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (I.getOpcode() == Instruction::FCmp)
|
||||||
|
return false;
|
||||||
|
|
||||||
// Otherwise look for a comparison between constant offset pointers with
|
// Otherwise look for a comparison between constant offset pointers with
|
||||||
// a common base.
|
// a common base.
|
||||||
|
@ -187,6 +187,37 @@ bb.false:
|
|||||||
ret i64 %y8
|
ret i64 %y8
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define float @caller6() {
|
||||||
|
; Check that we can constant-prop through fcmp instructions
|
||||||
|
;
|
||||||
|
; CHECK-LABEL: @caller6(
|
||||||
|
; CHECK-NOT: call
|
||||||
|
; CHECK: ret
|
||||||
|
%x = call float @callee6(float 42.0)
|
||||||
|
ret float %x
|
||||||
|
}
|
||||||
|
|
||||||
|
define float @callee6(float %x) {
|
||||||
|
%icmp = fcmp ugt float %x, 42.0
|
||||||
|
br i1 %icmp, label %bb.true, label %bb.false
|
||||||
|
|
||||||
|
bb.true:
|
||||||
|
; This block musn't be counted in the inline cost.
|
||||||
|
%x1 = fadd float %x, 1.0
|
||||||
|
%x2 = fadd float %x1, 1.0
|
||||||
|
%x3 = fadd float %x2, 1.0
|
||||||
|
%x4 = fadd float %x3, 1.0
|
||||||
|
%x5 = fadd float %x4, 1.0
|
||||||
|
%x6 = fadd float %x5, 1.0
|
||||||
|
%x7 = fadd float %x6, 1.0
|
||||||
|
%x8 = fadd float %x7, 1.0
|
||||||
|
ret float %x8
|
||||||
|
|
||||||
|
bb.false:
|
||||||
|
ret float %x
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
define i32 @PR13412.main() {
|
define i32 @PR13412.main() {
|
||||||
; This is a somewhat complicated three layer subprogram that was reported to
|
; This is a somewhat complicated three layer subprogram that was reported to
|
||||||
|
Loading…
Reference in New Issue
Block a user