diff --git a/llvm/include/llvm/Analysis/TargetLibraryInfo.def b/llvm/include/llvm/Analysis/TargetLibraryInfo.def index 03ac422d3e6b7..6bd922eed89e1 100644 --- a/llvm/include/llvm/Analysis/TargetLibraryInfo.def +++ b/llvm/include/llvm/Analysis/TargetLibraryInfo.def @@ -1570,7 +1570,7 @@ TLI_DEFINE_SIG_INTERNAL(Int, Int) /// long int labs(long int j); TLI_DEFINE_ENUM_INTERNAL(labs) TLI_DEFINE_STRING_INTERNAL("labs") -TLI_DEFINE_SIG_INTERNAL(Long, Long) +TLI_DEFINE_SIG_INTERNAL(Long, Same) /// int lchown(const char *path, uid_t owner, gid_t group); TLI_DEFINE_ENUM_INTERNAL(lchown) diff --git a/llvm/test/Transforms/InstCombine/pr69059.ll b/llvm/test/Transforms/InstCombine/pr69059.ll new file mode 100644 index 0000000000000..75690b8396520 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/pr69059.ll @@ -0,0 +1,16 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3 +; RUN: opt < %s -passes=instcombine -S | FileCheck %s + +define i64 @pr69059() { +; CHECK-LABEL: define i64 @pr69059() { +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CALL:%.*]] = call i64 @labs(i32 0) +; CHECK-NEXT: ret i64 [[CALL]] +; +entry: + %call = call i64 @labs(i32 0) + ret i64 %call +} + +; negative test: not a valid libfunc proto +declare i64 @labs(i32) diff --git a/llvm/unittests/Analysis/TargetLibraryInfoTest.cpp b/llvm/unittests/Analysis/TargetLibraryInfoTest.cpp index 8c2328ee1c9be..292b5cade9509 100644 --- a/llvm/unittests/Analysis/TargetLibraryInfoTest.cpp +++ b/llvm/unittests/Analysis/TargetLibraryInfoTest.cpp @@ -69,6 +69,16 @@ TEST_F(TargetLibraryInfoTest, InvalidProto) { M->getOrInsertFunction(TLI.getName(LF), InvalidFTy).getCallee()); EXPECT_FALSE(isLibFunc(F, LF)); } + + // i64 @labs(i32) + { + auto *InvalidLabsFTy = FunctionType::get(Type::getInt64Ty(Context), + {Type::getInt32Ty(Context)}, + /*isVarArg=*/false); + auto *F = cast( + M->getOrInsertFunction("labs", InvalidLabsFTy).getCallee()); + EXPECT_FALSE(isLibFunc(F, LibFunc_labs)); + } } // Check that we do accept know-correct prototypes.