mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-26 05:00:26 +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();
|
||||
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;
|
||||
|
@ -58,3 +58,14 @@ define i1 @test7(float %x) nounwind readnone ssp noredzone {
|
||||
; CHECK: @test7
|
||||
; 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…
Reference in New Issue
Block a user