Skip to content

Commit bad5893

Browse files
committed
Attributor: Fix not propagating nofpclass arguments through transitive callers
Fixes llvm#64867
1 parent 75a3cc9 commit bad5893

30 files changed

+838
-824
lines changed

llvm/lib/Transforms/IPO/AttributorAttributes.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10353,8 +10353,22 @@ struct AANoFPClassImpl : AANoFPClass {
1035310353
/*Depth=*/0, TLI, AC, I, DT);
1035410354
State.addKnownBits(~KnownFPClass.KnownFPClasses);
1035510355

10356-
bool TrackUse = false;
10357-
return TrackUse;
10356+
if (auto *CI = dyn_cast<CallInst>(UseV)) {
10357+
// Special case FP intrinsic with struct return type.
10358+
switch (CI->getIntrinsicID()) {
10359+
case Intrinsic::frexp:
10360+
return true;
10361+
case Intrinsic::not_intrinsic:
10362+
// TODO: Could recognize math libcalls
10363+
return false;
10364+
default:
10365+
break;
10366+
}
10367+
}
10368+
10369+
if (!UseV->getType()->isFPOrFPVectorTy())
10370+
return false;
10371+
return !isa<LoadInst, AtomicRMWInst>(UseV);
1035810372
}
1035910373

1036010374
const std::string getAsStr(Attributor *A) const override {

llvm/test/Transforms/Attributor/nofpclass-canonicalize.ll

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ declare float @llvm.canonicalize.f32(float)
55

66
define float @ret_canonicalize(float %arg0) {
77
; CHECK-LABEL: define nofpclass(snan) float @ret_canonicalize
8-
; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR1:[0-9]+]] {
8+
; CHECK-SAME: (float nofpclass(snan) [[ARG0:%.*]]) #[[ATTR1:[0-9]+]] {
99
; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(snan) float @llvm.canonicalize.f32(float [[ARG0]]) #[[ATTR12:[0-9]+]]
1010
; CHECK-NEXT: ret float [[CALL]]
1111
;
@@ -15,7 +15,7 @@ define float @ret_canonicalize(float %arg0) {
1515

1616
define float @ret_canonicalize_noinf(float nofpclass(inf) %arg0) {
1717
; CHECK-LABEL: define nofpclass(snan inf) float @ret_canonicalize_noinf
18-
; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]]) #[[ATTR1]] {
18+
; CHECK-SAME: (float nofpclass(snan inf) [[ARG0:%.*]]) #[[ATTR1]] {
1919
; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(snan inf) float @llvm.canonicalize.f32(float [[ARG0]]) #[[ATTR12]]
2020
; CHECK-NEXT: ret float [[CALL]]
2121
;
@@ -25,7 +25,7 @@ define float @ret_canonicalize_noinf(float nofpclass(inf) %arg0) {
2525

2626
define float @ret_canonicalize_dynamic_denormal(float nofpclass(inf) %arg0) "denormal-fp-math"="dynamic,dynamic" {
2727
; CHECK-LABEL: define nofpclass(snan inf) float @ret_canonicalize_dynamic_denormal
28-
; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]]) #[[ATTR2:[0-9]+]] {
28+
; CHECK-SAME: (float nofpclass(snan inf) [[ARG0:%.*]]) #[[ATTR2:[0-9]+]] {
2929
; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(snan inf) float @llvm.canonicalize.f32(float [[ARG0]]) #[[ATTR12]]
3030
; CHECK-NEXT: ret float [[CALL]]
3131
;
@@ -35,7 +35,7 @@ define float @ret_canonicalize_dynamic_denormal(float nofpclass(inf) %arg0) "den
3535

3636
define float @ret_canonicalize_daz_denormal(float nofpclass(inf) %arg0) "denormal-fp-math"="dynamic,preserve-sign" {
3737
; CHECK-LABEL: define nofpclass(snan inf sub) float @ret_canonicalize_daz_denormal
38-
; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]]) #[[ATTR3:[0-9]+]] {
38+
; CHECK-SAME: (float nofpclass(snan inf sub) [[ARG0:%.*]]) #[[ATTR3:[0-9]+]] {
3939
; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(snan inf sub) float @llvm.canonicalize.f32(float [[ARG0]]) #[[ATTR12]]
4040
; CHECK-NEXT: ret float [[CALL]]
4141
;
@@ -45,7 +45,7 @@ define float @ret_canonicalize_daz_denormal(float nofpclass(inf) %arg0) "denorma
4545

4646
define float @ret_canonicalize_dapz_denormal(float nofpclass(inf) %arg0) "denormal-fp-math"="dynamic,positive-zero" {
4747
; CHECK-LABEL: define nofpclass(snan inf nzero sub) float @ret_canonicalize_dapz_denormal
48-
; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]]) #[[ATTR4:[0-9]+]] {
48+
; CHECK-SAME: (float nofpclass(snan inf nzero sub) [[ARG0:%.*]]) #[[ATTR4:[0-9]+]] {
4949
; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(snan inf nzero sub) float @llvm.canonicalize.f32(float [[ARG0]]) #[[ATTR12]]
5050
; CHECK-NEXT: ret float [[CALL]]
5151
;
@@ -55,7 +55,7 @@ define float @ret_canonicalize_dapz_denormal(float nofpclass(inf) %arg0) "denorm
5555

5656
define float @ret_canonicalize_ftpz_dapz_denormal(float nofpclass(inf) %arg0) "denormal-fp-math"="positive-zero,preserve-sign" {
5757
; CHECK-LABEL: define nofpclass(snan inf sub) float @ret_canonicalize_ftpz_dapz_denormal
58-
; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]]) #[[ATTR5:[0-9]+]] {
58+
; CHECK-SAME: (float nofpclass(snan inf sub) [[ARG0:%.*]]) #[[ATTR5:[0-9]+]] {
5959
; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(snan inf sub) float @llvm.canonicalize.f32(float [[ARG0]]) #[[ATTR12]]
6060
; CHECK-NEXT: ret float [[CALL]]
6161
;
@@ -65,7 +65,7 @@ define float @ret_canonicalize_ftpz_dapz_denormal(float nofpclass(inf) %arg0) "d
6565

6666
define float @ret_canonicalize_ftpz_ieee_denormal(float nofpclass(inf) %arg0) "denormal-fp-math"="positive-zero,ieee" {
6767
; CHECK-LABEL: define nofpclass(snan inf nzero sub) float @ret_canonicalize_ftpz_ieee_denormal
68-
; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]]) #[[ATTR6:[0-9]+]] {
68+
; CHECK-SAME: (float nofpclass(snan inf nzero sub) [[ARG0:%.*]]) #[[ATTR6:[0-9]+]] {
6969
; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(snan inf nzero sub) float @llvm.canonicalize.f32(float [[ARG0]]) #[[ATTR12]]
7070
; CHECK-NEXT: ret float [[CALL]]
7171
;
@@ -75,7 +75,7 @@ define float @ret_canonicalize_ftpz_ieee_denormal(float nofpclass(inf) %arg0) "d
7575

7676
define float @ret_canonicalize_ftpz_dynamic_denormal(float nofpclass(inf) %arg0) "denormal-fp-math"="positive-zero,dynamic" {
7777
; CHECK-LABEL: define nofpclass(snan inf sub) float @ret_canonicalize_ftpz_dynamic_denormal
78-
; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]]) #[[ATTR7:[0-9]+]] {
78+
; CHECK-SAME: (float nofpclass(snan inf sub) [[ARG0:%.*]]) #[[ATTR7:[0-9]+]] {
7979
; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(snan inf sub) float @llvm.canonicalize.f32(float [[ARG0]]) #[[ATTR12]]
8080
; CHECK-NEXT: ret float [[CALL]]
8181
;
@@ -85,7 +85,7 @@ define float @ret_canonicalize_ftpz_dynamic_denormal(float nofpclass(inf) %arg0)
8585

8686
define float @ret_canonicalize_ftz_denormal(float nofpclass(inf) %arg0) "denormal-fp-math"="preserve-sign,dynamic" {
8787
; CHECK-LABEL: define nofpclass(snan inf sub) float @ret_canonicalize_ftz_denormal
88-
; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]]) #[[ATTR8:[0-9]+]] {
88+
; CHECK-SAME: (float nofpclass(snan inf sub) [[ARG0:%.*]]) #[[ATTR8:[0-9]+]] {
8989
; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(snan inf sub) float @llvm.canonicalize.f32(float [[ARG0]]) #[[ATTR12]]
9090
; CHECK-NEXT: ret float [[CALL]]
9191
;
@@ -95,7 +95,7 @@ define float @ret_canonicalize_ftz_denormal(float nofpclass(inf) %arg0) "denorma
9595

9696
define float @ret_canonicalize_ieee_denormal(float nofpclass(inf) %arg0) "denormal-fp-math"="ieee,ieee" {
9797
; CHECK-LABEL: define nofpclass(snan inf) float @ret_canonicalize_ieee_denormal
98-
; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]]) #[[ATTR9:[0-9]+]] {
98+
; CHECK-SAME: (float nofpclass(snan inf) [[ARG0:%.*]]) #[[ATTR9:[0-9]+]] {
9999
; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(snan inf) float @llvm.canonicalize.f32(float [[ARG0]]) #[[ATTR12]]
100100
; CHECK-NEXT: ret float [[CALL]]
101101
;

0 commit comments

Comments
 (0)