mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-15 05:24:01 +00:00
float comparison to double 'zero' constant can just be a float 'zero.'
InstCombine was incorrectly considering the conversion of the constant zero to be unsafe. We want to transform: define float @bar(float %x) nounwind readnone optsize ssp { %conv = fpext float %x to double %cmp = fcmp olt double %conv, 0.000000e+00 %conv1 = zext i1 %cmp to i32 %conv2 = sitofp i32 %conv1 to float ret float %conv2 } Into: define float @bar(float %x) nounwind readnone optsize ssp { %cmp = fcmp olt float %x, 0.000000e+00 ; <---- This %conv1 = zext i1 %cmp to i32 %conv2 = sitofp i32 %conv1 to float ret float %conv2 } rdar://10215914 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140869 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -2837,10 +2837,13 @@ Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
|
||||
APFloat F = RHSF->getValueAPF();
|
||||
F.convert(*Sem, APFloat::rmNearestTiesToEven, &Lossy);
|
||||
|
||||
// Avoid lossy conversions and denormals.
|
||||
// Avoid lossy conversions and denormals. Zero is a special case
|
||||
// that's OK to convert.
|
||||
F.clearSign();
|
||||
if (!Lossy &&
|
||||
F.compare(APFloat::getSmallestNormalized(*Sem)) !=
|
||||
APFloat::cmpLessThan)
|
||||
((F.compare(APFloat::getSmallestNormalized(*Sem)) !=
|
||||
APFloat::cmpLessThan) || F.isZero()))
|
||||
|
||||
return new FCmpInst(I.getPredicate(), LHSExt->getOperand(0),
|
||||
ConstantFP::get(RHSC->getContext(), F));
|
||||
break;
|
||||
|
Reference in New Issue
Block a user