mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-18 22:38:56 +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:
parent
d98f838284
commit
cbf676b3ba
@ -2837,10 +2837,13 @@ Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
|
|||||||
APFloat F = RHSF->getValueAPF();
|
APFloat F = RHSF->getValueAPF();
|
||||||
F.convert(*Sem, APFloat::rmNearestTiesToEven, &Lossy);
|
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 &&
|
if (!Lossy &&
|
||||||
F.compare(APFloat::getSmallestNormalized(*Sem)) !=
|
((F.compare(APFloat::getSmallestNormalized(*Sem)) !=
|
||||||
APFloat::cmpLessThan)
|
APFloat::cmpLessThan) || F.isZero()))
|
||||||
|
|
||||||
return new FCmpInst(I.getPredicate(), LHSExt->getOperand(0),
|
return new FCmpInst(I.getPredicate(), LHSExt->getOperand(0),
|
||||||
ConstantFP::get(RHSC->getContext(), F));
|
ConstantFP::get(RHSC->getContext(), F));
|
||||||
break;
|
break;
|
||||||
|
@ -58,3 +58,14 @@ define i1 @test7(float %x) nounwind readnone ssp noredzone {
|
|||||||
; CHECK: @test7
|
; CHECK: @test7
|
||||||
; CHECK-NEXT: fpext float %x to ppc_fp128
|
; CHECK-NEXT: fpext float %x to ppc_fp128
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define float @test8(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
|
||||||
|
; Float comparison to zero shouldn't cast to double.
|
||||||
|
; CHECK: @test8
|
||||||
|
; CHECK-NEXT: fcmp olt float %x, 0.000000e+00
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user