1ad3ad152SDavid Green; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2ad3ad152SDavid Green; RUN: opt -S -passes=instcombine < %s | FileCheck %s 3ad3ad152SDavid Green 4ad3ad152SDavid Greendefine float @test_inf_const(float %f) { 5ad3ad152SDavid Green; CHECK-LABEL: define float @test_inf_const( 6ad3ad152SDavid Green; CHECK-SAME: float [[F:%.*]]) { 7ad3ad152SDavid Green; CHECK-NEXT: entry: 8ad3ad152SDavid Green; CHECK-NEXT: [[ABS:%.*]] = tail call float @llvm.fabs.f32(float [[F]]) 9ad3ad152SDavid Green; CHECK-NEXT: [[ISINF:%.*]] = fcmp oeq float [[ABS]], 0x7FF0000000000000 10ad3ad152SDavid Green; CHECK-NEXT: br i1 [[ISINF]], label [[RETURN:%.*]], label [[IF_END:%.*]] 11ad3ad152SDavid Green; CHECK: if.end: 12*112aac4eSDavid Green; CHECK-NEXT: [[CALL:%.*]] = frem nnan float [[F]], 2.000000e+00 13ad3ad152SDavid Green; CHECK-NEXT: ret float [[CALL]] 14ad3ad152SDavid Green; CHECK: return: 15ad3ad152SDavid Green; CHECK-NEXT: ret float 0.000000e+00 16ad3ad152SDavid Green; 17ad3ad152SDavid Greenentry: 18ad3ad152SDavid Green %abs = tail call float @llvm.fabs.f32(float %f) 19ad3ad152SDavid Green %isinf = fcmp oeq float %abs, 0x7FF0000000000000 20ad3ad152SDavid Green br i1 %isinf, label %return, label %if.end 21ad3ad152SDavid Green 22ad3ad152SDavid Greenif.end: 23ad3ad152SDavid Green %call = tail call float @fmodf(float %f, float 2.0) 24ad3ad152SDavid Green ret float %call 25ad3ad152SDavid Green 26ad3ad152SDavid Greenreturn: 27ad3ad152SDavid Green ret float 0.0 28ad3ad152SDavid Green} 29ad3ad152SDavid Green 30ad3ad152SDavid Greendefine float @test_const_zero(float %f) { 31ad3ad152SDavid Green; CHECK-LABEL: define float @test_const_zero( 32ad3ad152SDavid Green; CHECK-SAME: float [[F:%.*]]) { 33ad3ad152SDavid Green; CHECK-NEXT: entry: 34ad3ad152SDavid Green; CHECK-NEXT: [[ISZERO:%.*]] = fcmp oeq float [[F]], 0.000000e+00 35ad3ad152SDavid Green; CHECK-NEXT: br i1 [[ISZERO]], label [[RETURN:%.*]], label [[IF_END:%.*]] 36ad3ad152SDavid Green; CHECK: if.end: 37*112aac4eSDavid Green; CHECK-NEXT: [[CALL:%.*]] = frem nnan float 2.000000e+00, [[F]] 38ad3ad152SDavid Green; CHECK-NEXT: ret float [[CALL]] 39ad3ad152SDavid Green; CHECK: return: 40ad3ad152SDavid Green; CHECK-NEXT: ret float 0.000000e+00 41ad3ad152SDavid Green; 42ad3ad152SDavid Greenentry: 43ad3ad152SDavid Green %iszero = fcmp oeq float %f, 0.0 44ad3ad152SDavid Green br i1 %iszero, label %return, label %if.end 45ad3ad152SDavid Green 46ad3ad152SDavid Greenif.end: 47ad3ad152SDavid Green %call = tail call float @fmodf(float 2.0, float %f) 48ad3ad152SDavid Green ret float %call 49ad3ad152SDavid Green 50ad3ad152SDavid Greenreturn: 51ad3ad152SDavid Green ret float 0.0 52ad3ad152SDavid Green} 53ad3ad152SDavid Green 54ad3ad152SDavid Greendefine float @test_unknown_const(float %f) { 55ad3ad152SDavid Green; CHECK-LABEL: define float @test_unknown_const( 56ad3ad152SDavid Green; CHECK-SAME: float [[F:%.*]]) { 57ad3ad152SDavid Green; CHECK-NEXT: entry: 58ad3ad152SDavid Green; CHECK-NEXT: [[CALL:%.*]] = tail call float @fmodf(float [[F]], float 2.000000e+00) 59ad3ad152SDavid Green; CHECK-NEXT: ret float [[CALL]] 60ad3ad152SDavid Green; 61ad3ad152SDavid Greenentry: 62ad3ad152SDavid Green %call = tail call float @fmodf(float %f, float 2.000000e+00) 63ad3ad152SDavid Green ret float %call 64ad3ad152SDavid Green} 65ad3ad152SDavid Green 66ad3ad152SDavid Greendefine float @test_noinf_nozero(float nofpclass(inf) %f, float nofpclass(zero) %g) { 67ad3ad152SDavid Green; CHECK-LABEL: define float @test_noinf_nozero( 68ad3ad152SDavid Green; CHECK-SAME: float nofpclass(inf) [[F:%.*]], float nofpclass(zero) [[G:%.*]]) { 69ad3ad152SDavid Green; CHECK-NEXT: entry: 70*112aac4eSDavid Green; CHECK-NEXT: [[CALL:%.*]] = frem nnan float [[F]], [[G]] 71ad3ad152SDavid Green; CHECK-NEXT: ret float [[CALL]] 72ad3ad152SDavid Green; 73ad3ad152SDavid Greenentry: 74*112aac4eSDavid Green %call = tail call float @fmodf(float %f, float %g) 75ad3ad152SDavid Green ret float %call 76ad3ad152SDavid Green} 77ad3ad152SDavid Green 78ad3ad152SDavid Greendefine double @test_double(double nofpclass(inf) %f, double nofpclass(zero) %g) { 79ad3ad152SDavid Green; CHECK-LABEL: define double @test_double( 80ad3ad152SDavid Green; CHECK-SAME: double nofpclass(inf) [[F:%.*]], double nofpclass(zero) [[G:%.*]]) { 81ad3ad152SDavid Green; CHECK-NEXT: entry: 82*112aac4eSDavid Green; CHECK-NEXT: [[CALL:%.*]] = frem nnan double [[F]], [[G]] 83ad3ad152SDavid Green; CHECK-NEXT: ret double [[CALL]] 84ad3ad152SDavid Green; 85ad3ad152SDavid Greenentry: 86ad3ad152SDavid Green %call = tail call double @fmod(double %f, double %g) 87ad3ad152SDavid Green ret double %call 88ad3ad152SDavid Green} 89ad3ad152SDavid Green 90ad3ad152SDavid Greendefine fp128 @test_fp128(fp128 nofpclass(inf) %f, fp128 nofpclass(zero) %g) { 91ad3ad152SDavid Green; CHECK-LABEL: define fp128 @test_fp128( 92ad3ad152SDavid Green; CHECK-SAME: fp128 nofpclass(inf) [[F:%.*]], fp128 nofpclass(zero) [[G:%.*]]) { 93ad3ad152SDavid Green; CHECK-NEXT: entry: 94*112aac4eSDavid Green; CHECK-NEXT: [[CALL:%.*]] = frem nnan fp128 [[F]], [[G]] 95ad3ad152SDavid Green; CHECK-NEXT: ret fp128 [[CALL]] 96ad3ad152SDavid Green; 97ad3ad152SDavid Greenentry: 98ad3ad152SDavid Green %call = tail call fp128 @fmodl(fp128 %f, fp128 %g) 99ad3ad152SDavid Green ret fp128 %call 100ad3ad152SDavid Green} 101ad3ad152SDavid Green 102ad3ad152SDavid Greendefine float @test_noinf_nozero_dazpreservesign(float nofpclass(inf) %f, float nofpclass(zero) %g) "denormal-fp-math"="preserve-sign,preserve-sign" { 103ad3ad152SDavid Green; CHECK-LABEL: define float @test_noinf_nozero_dazpreservesign( 104ad3ad152SDavid Green; CHECK-SAME: float nofpclass(inf) [[F:%.*]], float nofpclass(zero) [[G:%.*]]) #[[ATTR0:[0-9]+]] { 105ad3ad152SDavid Green; CHECK-NEXT: entry: 106*112aac4eSDavid Green; CHECK-NEXT: [[CALL:%.*]] = tail call float @fmodf(float [[F]], float [[G]]) 107ad3ad152SDavid Green; CHECK-NEXT: ret float [[CALL]] 108ad3ad152SDavid Green; 109ad3ad152SDavid Greenentry: 110*112aac4eSDavid Green %call = tail call float @fmodf(float %f, float %g) 111ad3ad152SDavid Green ret float %call 112ad3ad152SDavid Green} 113ad3ad152SDavid Green 114ad3ad152SDavid Greendefine float @test_noinf_nozero_dazdynamic(float nofpclass(inf) %f, float nofpclass(zero) %g) "denormal-fp-math"="dynamic,dynamic" { 115ad3ad152SDavid Green; CHECK-LABEL: define float @test_noinf_nozero_dazdynamic( 116ad3ad152SDavid Green; CHECK-SAME: float nofpclass(inf) [[F:%.*]], float nofpclass(zero) [[G:%.*]]) #[[ATTR1:[0-9]+]] { 117ad3ad152SDavid Green; CHECK-NEXT: entry: 118*112aac4eSDavid Green; CHECK-NEXT: [[CALL:%.*]] = tail call float @fmodf(float [[F]], float [[G]]) 119*112aac4eSDavid Green; CHECK-NEXT: ret float [[CALL]] 120*112aac4eSDavid Green; 121*112aac4eSDavid Greenentry: 122*112aac4eSDavid Green %call = tail call float @fmodf(float %f, float %g) 123*112aac4eSDavid Green ret float %call 124*112aac4eSDavid Green} 125*112aac4eSDavid Green 126*112aac4eSDavid Greendefine float @test_nnan(float %f, float %g) { 127*112aac4eSDavid Green; CHECK-LABEL: define float @test_nnan( 128*112aac4eSDavid Green; CHECK-SAME: float [[F:%.*]], float [[G:%.*]]) { 129*112aac4eSDavid Green; CHECK-NEXT: entry: 130*112aac4eSDavid Green; CHECK-NEXT: [[CALL:%.*]] = frem nnan float [[F]], [[G]] 131ad3ad152SDavid Green; CHECK-NEXT: ret float [[CALL]] 132ad3ad152SDavid Green; 133ad3ad152SDavid Greenentry: 134ad3ad152SDavid Green %call = tail call nnan float @fmodf(float %f, float %g) 135ad3ad152SDavid Green ret float %call 136ad3ad152SDavid Green} 137ad3ad152SDavid Green 138ad3ad152SDavid Greendeclare float @fmodf(float, float) 139ad3ad152SDavid Greendeclare double @fmod(double, double) 140ad3ad152SDavid Greendeclare fp128 @fmodl(fp128, fp128) 141