diff options
author | Sanjay Patel <spatel@rotateright.com> | 2016-01-20 17:41:14 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2016-01-20 17:41:14 +0000 |
commit | bd2dc67142a1861b89e8a9752f9fb407afcf7b07 (patch) | |
tree | 23b9eb64dd724c30a6f18d2f128af0686bc42c58 /llvm/test/Transforms/InstCombine/cos-2.ll | |
parent | 6c3e790e788fea0b9a40f62995c87a14f48f2e02 (diff) | |
download | bcm5719-llvm-bd2dc67142a1861b89e8a9752f9fb407afcf7b07.tar.gz bcm5719-llvm-bd2dc67142a1861b89e8a9752f9fb407afcf7b07.zip |
[LibCallSimplifier] don't get fooled by a fake sqrt()
The test case will crash without this patch because the subsequent call to
hasUnsafeAlgebra() assumes that the call instruction is an FPMathOperator
(ie, returns an FP type).
This part of the function signature check was omitted for the sqrt() case,
but seems to be in place for all other transforms.
Before:
http://reviews.llvm.org/rL257400
...we would have needlessly continued execution in optimizeSqrt(), but the
bug was harmless because we'd eventually fail some other check and return
without damage.
This should fix:
https://llvm.org/bugs/show_bug.cgi?id=26211
Differential Revision: http://reviews.llvm.org/D16198
llvm-svn: 258325
Diffstat (limited to 'llvm/test/Transforms/InstCombine/cos-2.ll')
-rw-r--r-- | llvm/test/Transforms/InstCombine/cos-2.ll | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/llvm/test/Transforms/InstCombine/cos-2.ll b/llvm/test/Transforms/InstCombine/cos-2.ll index c9a9c7c0771..a85cc8fa6bd 100644 --- a/llvm/test/Transforms/InstCombine/cos-2.ll +++ b/llvm/test/Transforms/InstCombine/cos-2.ll @@ -1,12 +1,11 @@ -; Test that the cos library call simplifier works correctly. -; ; RUN: opt < %s -instcombine -S | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" declare float @cos(double) +declare signext i8 @sqrt(...) -; Check that cos functions with the wrong prototype aren't simplified. +; Check that functions with the wrong prototype aren't simplified. define float @test_no_simplify1(double %d) { ; CHECK-LABEL: @test_no_simplify1( @@ -15,3 +14,14 @@ define float @test_no_simplify1(double %d) { ; CHECK: call float @cos(double %neg) ret float %cos } + + +define i8 @bogus_sqrt() { + %fake_sqrt = call signext i8 (...) @sqrt() + ret i8 %fake_sqrt + +; CHECK-LABEL: bogus_sqrt( +; CHECK-NEXT: %fake_sqrt = call signext i8 (...) @sqrt() +; CHECK-NEXT: ret i8 %fake_sqrt +} + |