mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-22 10:29:35 +00:00
enhance the previous optimization to work with fcmp in addition
to icmp. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@92412 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1f12e44b62
commit
34e0c76f93
@ -6180,7 +6180,7 @@ Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
|
||||
if (Instruction *NV = FoldFCmp_IntToFP_Cst(I, LHSI, RHSC))
|
||||
return NV;
|
||||
break;
|
||||
case Instruction::Select:
|
||||
case Instruction::Select: {
|
||||
// If either operand of the select is a constant, we can fold the
|
||||
// comparison into the select arms, which will cause one to be
|
||||
// constant folded and the select turned into a bitwise or.
|
||||
@ -6205,6 +6205,20 @@ Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
|
||||
return SelectInst::Create(LHSI->getOperand(0), Op1, Op2);
|
||||
break;
|
||||
}
|
||||
case Instruction::Load:
|
||||
if (GetElementPtrInst *GEP =
|
||||
dyn_cast<GetElementPtrInst>(LHSI->getOperand(0))) {
|
||||
if (GlobalVariable *GV = dyn_cast<GlobalVariable>(GEP->getOperand(0)))
|
||||
if (GV->isConstant() && GV->hasDefinitiveInitializer() &&
|
||||
!cast<LoadInst>(LHSI)->isVolatile())
|
||||
if (Instruction *Res = FoldCmpLoadFromIndexedGlobal(GEP, GV, I))
|
||||
return Res;
|
||||
//errs() << "NOT HANDLED: " << *GV << "\n";
|
||||
//errs() << "\t" << *GEP << "\n";
|
||||
//errs() << "\t " << I << "\n\n\n";
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return Changed ? &I : 0;
|
||||
@ -6586,13 +6600,16 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
|
||||
|
||||
case Instruction::Load:
|
||||
if (GetElementPtrInst *GEP =
|
||||
dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
|
||||
dyn_cast<GetElementPtrInst>(LHSI->getOperand(0))) {
|
||||
if (GlobalVariable *GV = dyn_cast<GlobalVariable>(GEP->getOperand(0)))
|
||||
if (GV->isConstant() && GV->hasDefinitiveInitializer() &&
|
||||
!cast<LoadInst>(LHSI)->isVolatile()) {
|
||||
!cast<LoadInst>(LHSI)->isVolatile())
|
||||
if (Instruction *Res = FoldCmpLoadFromIndexedGlobal(GEP, GV, I))
|
||||
return Res;
|
||||
}
|
||||
//errs() << "NOT HANDLED: " << *GV << "\n";
|
||||
//errs() << "\t" << *GEP << "\n";
|
||||
//errs() << "\t " << I << "\n\n\n";
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
@G16 = internal constant [10 x i16] [i16 35, i16 82, i16 69, i16 81, i16 85,
|
||||
i16 73, i16 82, i16 69, i16 68, i16 0]
|
||||
@GD = internal constant [3 x double] [double 1.0, double 4.0, double -20.0]
|
||||
|
||||
define i1 @test1(i32 %X) {
|
||||
%P = getelementptr [10 x i16]* @G16, i32 0, i32 %X
|
||||
@ -23,3 +24,13 @@ define i1 @test2(i32 %X) {
|
||||
; CHECK-NEXT: ret i1 %R
|
||||
}
|
||||
|
||||
define i1 @test3(i32 %X) {
|
||||
%P = getelementptr [3 x double]* @GD, i32 0, i32 %X
|
||||
%Q = load double* %P
|
||||
%R = fcmp oeq double %Q, 1.0
|
||||
ret i1 %R
|
||||
; CHECK: @test3
|
||||
; CHECK-NEXT: %R = icmp eq i32 %X, 0
|
||||
; CHECK-NEXT: ret i1 %R
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user