xref: /llvm-project/llvm/test/Transforms/InstCombine/fmod.ll (revision 112aac4e8961b9626bb84f36deeaa5a674f03f5a)
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