mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +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 visitCastInst(CastInst &I);
|
||||
bool visitUnaryInstruction(UnaryInstruction &I);
|
||||
bool visitICmp(ICmpInst &I);
|
||||
bool visitCmpInst(CmpInst &I);
|
||||
bool visitSub(BinaryOperator &I);
|
||||
bool visitBinaryOperator(BinaryOperator &I);
|
||||
bool visitLoad(LoadInst &I);
|
||||
@ -490,7 +490,7 @@ bool CallAnalyzer::visitUnaryInstruction(UnaryInstruction &I) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CallAnalyzer::visitICmp(ICmpInst &I) {
|
||||
bool CallAnalyzer::visitCmpInst(CmpInst &I) {
|
||||
Value *LHS = I.getOperand(0), *RHS = I.getOperand(1);
|
||||
// First try to handle simplified comparisons.
|
||||
if (!isa<Constant>(LHS))
|
||||
@ -499,12 +499,16 @@ bool CallAnalyzer::visitICmp(ICmpInst &I) {
|
||||
if (!isa<Constant>(RHS))
|
||||
if (Constant *SimpleRHS = SimplifiedValues.lookup(RHS))
|
||||
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 *C = ConstantExpr::getICmp(I.getPredicate(), CLHS, CRHS)) {
|
||||
if (Constant *C = ConstantExpr::getCompare(I.getPredicate(), CLHS, CRHS)) {
|
||||
SimplifiedValues[&I] = C;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (I.getOpcode() == Instruction::FCmp)
|
||||
return false;
|
||||
|
||||
// Otherwise look for a comparison between constant offset pointers with
|
||||
// a common base.
|
||||
|
@ -187,6 +187,37 @@ bb.false:
|
||||
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() {
|
||||
; This is a somewhat complicated three layer subprogram that was reported to
|
||||
|
Loading…
Reference in New Issue
Block a user