diff --git a/llvm/lib/Transforms/Utils/SCCPSolver.cpp b/llvm/lib/Transforms/Utils/SCCPSolver.cpp --- a/llvm/lib/Transforms/Utils/SCCPSolver.cpp +++ b/llvm/lib/Transforms/Utils/SCCPSolver.cpp @@ -1188,9 +1188,12 @@ // a declaration, maybe we can constant fold it. if (F && F->isDeclaration() && canConstantFoldCallTo(&CB, F)) { SmallVector Operands; + bool IsCI = isa(&CB); for (const Use &A : CB.args()) { if (A.get()->getType()->isStructTy()) return markOverdefined(&CB); // Can't handle struct args. + if (IsCI && A.get()->getType()->isMetadataTy()) + continue; ValueLatticeElement State = getValueState(A); if (State.isUnknownOrUndef()) diff --git a/llvm/test/Transforms/SCCP/strictfp-phis-fcmp.ll b/llvm/test/Transforms/SCCP/strictfp-phis-fcmp.ll --- a/llvm/test/Transforms/SCCP/strictfp-phis-fcmp.ll +++ b/llvm/test/Transforms/SCCP/strictfp-phis-fcmp.ll @@ -8,8 +8,7 @@ ; 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: @@ -32,8 +31,7 @@ ; 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: @@ -56,8 +54,8 @@ ; 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: @@ -224,8 +222,7 @@ ; 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: @@ -250,8 +247,7 @@ ; 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: @@ -278,7 +274,7 @@ ; 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: diff --git a/llvm/test/Transforms/SCCP/strictfp-phis-fcmps.ll b/llvm/test/Transforms/SCCP/strictfp-phis-fcmps.ll --- a/llvm/test/Transforms/SCCP/strictfp-phis-fcmps.ll +++ b/llvm/test/Transforms/SCCP/strictfp-phis-fcmps.ll @@ -8,8 +8,7 @@ ; 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: @@ -32,8 +31,7 @@ ; 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: @@ -56,8 +54,8 @@ ; 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: @@ -224,8 +222,7 @@ ; 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: @@ -250,8 +247,7 @@ ; 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: @@ -278,7 +274,7 @@ ; 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: