From f425efdbc290cc8af63c2a620699bf13c5df6e57 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Fri, 1 Aug 2014 23:21:21 +0000 Subject: [PATCH] PartiallyInlineLibCalls: Check sqrt result type before transforming it. Some configure scripts declare this with the wrong prototype, which can lead to an assertion failure. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214593 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/PartiallyInlineLibCalls.cpp | 4 ++++ .../PartiallyInlineLibCalls/bad-prototype.ll | 13 +++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 test/Transforms/PartiallyInlineLibCalls/bad-prototype.ll diff --git a/lib/Transforms/Scalar/PartiallyInlineLibCalls.cpp b/lib/Transforms/Scalar/PartiallyInlineLibCalls.cpp index 7cce89e0627..5c8bed585b6 100644 --- a/lib/Transforms/Scalar/PartiallyInlineLibCalls.cpp +++ b/lib/Transforms/Scalar/PartiallyInlineLibCalls.cpp @@ -108,6 +108,10 @@ bool PartiallyInlineLibCalls::optimizeSQRT(CallInst *Call, if (Call->onlyReadsMemory()) return false; + // The call must have the expected result type. + if (!Call->getType()->isFloatingPointTy()) + return false; + // Do the following transformation: // // (before) diff --git a/test/Transforms/PartiallyInlineLibCalls/bad-prototype.ll b/test/Transforms/PartiallyInlineLibCalls/bad-prototype.ll new file mode 100644 index 00000000000..34cd672ed26 --- /dev/null +++ b/test/Transforms/PartiallyInlineLibCalls/bad-prototype.ll @@ -0,0 +1,13 @@ +; RUN: opt -S -partially-inline-libcalls < %s | FileCheck %s + +target triple = "x86_64-unknown-linux-gnu" + +declare i32 @sqrt() + +; CHECK-LABEL: @foo +define i32 @foo() { + ; CHECK: call{{.*}}@sqrt + ; CHECK-NOT: call{{.*}}@sqrt + %r = call i32 @sqrt() + ret i32 %r +} -- 2.34.1