Skip to content

Commit

Permalink
[StrictFP][IPSCCP] Constant fold intrinsics with metadata arguments
Browse files Browse the repository at this point in the history
This teaches the SCCP Solver how to constant fold more intrinsics. Constant
folding appears to be just as good as D115737 but much, much lower in code
change impact as suggested by nikic.

The constrained floating-point intrinsics all take at least one metadata
argument and were the motivation for the change.

Differential Revision: https://reviews.llvm.org/D136466
  • Loading branch information
kpneal committed Oct 24, 2022
1 parent 718bb22 commit cfb88ee
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 22 deletions.
2 changes: 2 additions & 0 deletions llvm/lib/Transforms/Utils/SCCPSolver.cpp
Expand Up @@ -1191,6 +1191,8 @@ void SCCPInstVisitor::handleCallOverdefined(CallBase &CB) {
for (const Use &A : CB.args()) {
if (A.get()->getType()->isStructTy())
return markOverdefined(&CB); // Can't handle struct args.
if (A.get()->getType()->isMetadataTy())
continue; // Carried in CB, not allowed in Operands.
ValueLatticeElement State = getValueState(A);

if (State.isUnknownOrUndef())
Expand Down
18 changes: 7 additions & 11 deletions llvm/test/Transforms/SCCP/strictfp-phis-fcmp.ll
Expand Up @@ -8,8 +8,7 @@ define i1 @float.1.defaultenv(i1 %cmp) #0 {
; CHECK: if.true:
; CHECK-NEXT: br label [[END]]
; CHECK: end:
; CHECK-NEXT: [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f32(float 1.000000e+00, float 1.000000e+00, metadata !"ueq", metadata !"fpexcept.ignore") #[[ATTR0:[0-9]+]]
; CHECK-NEXT: ret i1 [[C]]
; CHECK-NEXT: ret i1 true
;

entry:
Expand All @@ -32,8 +31,7 @@ define i1 @float.1.maytrap(i1 %cmp) #0 {
; CHECK: if.true:
; CHECK-NEXT: br label [[END]]
; CHECK: end:
; CHECK-NEXT: [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f32(float 1.000000e+00, float 1.000000e+00, metadata !"ueq", metadata !"fpexcept.maytrap") #[[ATTR0]]
; CHECK-NEXT: ret i1 [[C]]
; CHECK-NEXT: ret i1 true
;

entry:
Expand All @@ -56,8 +54,8 @@ define i1 @float.1.strict(i1 %cmp) #0 {
; CHECK: if.true:
; CHECK-NEXT: br label [[END]]
; CHECK: end:
; CHECK-NEXT: [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f32(float 1.000000e+00, float 1.000000e+00, metadata !"ueq", metadata !"fpexcept.strict") #[[ATTR0]]
; CHECK-NEXT: ret i1 [[C]]
; CHECK-NEXT: [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f32(float 1.000000e+00, float 1.000000e+00, metadata !"ueq", metadata !"fpexcept.strict") #[[ATTR0:[0-9]+]]
; CHECK-NEXT: ret i1 true
;

entry:
Expand Down Expand Up @@ -224,8 +222,7 @@ define i1 @float.4_unreachable.defaultenv(float %f, i1 %cmp) #0 {
; CHECK: if.true:
; CHECK-NEXT: br label [[END]]
; CHECK: end:
; CHECK-NEXT: [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f32(float 1.000000e+00, float 1.000000e+00, metadata !"une", metadata !"fpexcept.ignore") #[[ATTR0]]
; CHECK-NEXT: ret i1 [[C]]
; CHECK-NEXT: ret i1 false
;

entry:
Expand All @@ -250,8 +247,7 @@ define i1 @float.4_unreachable.maytrap(float %f, i1 %cmp) #0 {
; CHECK: if.true:
; CHECK-NEXT: br label [[END]]
; CHECK: end:
; CHECK-NEXT: [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f32(float 1.000000e+00, float 1.000000e+00, metadata !"une", metadata !"fpexcept.maytrap") #[[ATTR0]]
; CHECK-NEXT: ret i1 [[C]]
; CHECK-NEXT: ret i1 false
;

entry:
Expand All @@ -278,7 +274,7 @@ define i1 @float.4_unreachable.strict(float %f, i1 %cmp) #0 {
; CHECK-NEXT: br label [[END]]
; CHECK: end:
; CHECK-NEXT: [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f32(float 1.000000e+00, float 1.000000e+00, metadata !"une", metadata !"fpexcept.strict") #[[ATTR0]]
; CHECK-NEXT: ret i1 [[C]]
; CHECK-NEXT: ret i1 false
;

entry:
Expand Down
18 changes: 7 additions & 11 deletions llvm/test/Transforms/SCCP/strictfp-phis-fcmps.ll
Expand Up @@ -8,8 +8,7 @@ define i1 @float.1.defaultenv(i1 %cmp) #0 {
; CHECK: if.true:
; CHECK-NEXT: br label [[END]]
; CHECK: end:
; CHECK-NEXT: [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float 1.000000e+00, float 1.000000e+00, metadata !"ueq", metadata !"fpexcept.ignore") #[[ATTR0:[0-9]+]]
; CHECK-NEXT: ret i1 [[C]]
; CHECK-NEXT: ret i1 true
;

entry:
Expand All @@ -32,8 +31,7 @@ define i1 @float.1.maytrap(i1 %cmp) #0 {
; CHECK: if.true:
; CHECK-NEXT: br label [[END]]
; CHECK: end:
; CHECK-NEXT: [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float 1.000000e+00, float 1.000000e+00, metadata !"ueq", metadata !"fpexcept.maytrap") #[[ATTR0]]
; CHECK-NEXT: ret i1 [[C]]
; CHECK-NEXT: ret i1 true
;

entry:
Expand All @@ -56,8 +54,8 @@ define i1 @float.1.strict(i1 %cmp) #0 {
; CHECK: if.true:
; CHECK-NEXT: br label [[END]]
; CHECK: end:
; CHECK-NEXT: [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float 1.000000e+00, float 1.000000e+00, metadata !"ueq", metadata !"fpexcept.strict") #[[ATTR0]]
; CHECK-NEXT: ret i1 [[C]]
; CHECK-NEXT: [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float 1.000000e+00, float 1.000000e+00, metadata !"ueq", metadata !"fpexcept.strict") #[[ATTR0:[0-9]+]]
; CHECK-NEXT: ret i1 true
;

entry:
Expand Down Expand Up @@ -224,8 +222,7 @@ define i1 @float.4_unreachable.defaultenv(float %f, i1 %cmp) #0 {
; CHECK: if.true:
; CHECK-NEXT: br label [[END]]
; CHECK: end:
; CHECK-NEXT: [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float 1.000000e+00, float 1.000000e+00, metadata !"une", metadata !"fpexcept.ignore") #[[ATTR0]]
; CHECK-NEXT: ret i1 [[C]]
; CHECK-NEXT: ret i1 false
;

entry:
Expand All @@ -250,8 +247,7 @@ define i1 @float.4_unreachable.maytrap(float %f, i1 %cmp) #0 {
; CHECK: if.true:
; CHECK-NEXT: br label [[END]]
; CHECK: end:
; CHECK-NEXT: [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float 1.000000e+00, float 1.000000e+00, metadata !"une", metadata !"fpexcept.maytrap") #[[ATTR0]]
; CHECK-NEXT: ret i1 [[C]]
; CHECK-NEXT: ret i1 false
;

entry:
Expand All @@ -278,7 +274,7 @@ define i1 @float.4_unreachable.strict(float %f, i1 %cmp) #0 {
; CHECK-NEXT: br label [[END]]
; CHECK: end:
; CHECK-NEXT: [[C:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f32(float 1.000000e+00, float 1.000000e+00, metadata !"une", metadata !"fpexcept.strict") #[[ATTR0]]
; CHECK-NEXT: ret i1 [[C]]
; CHECK-NEXT: ret i1 false
;

entry:
Expand Down

0 comments on commit cfb88ee

Please sign in to comment.