145 Commits

Author SHA1 Message Date
Sanjay Patel
78a42b0707 [LibCallSimplifier] use instruction-level fast-math-flags for tan/atan transform
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256964 91177308-0d34-0410-b5e6-96231b3b80d8
2016-01-06 19:23:35 +00:00
David Majnemer
4cb9f9dcb1 [SimplifyLibCalls] Teach SimplifyLibCalls about operand bundles
If we replace one call-site with another, be sure to move over any
operand bundles that lingered on the old call-site.

This fixes PR26036.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256912 91177308-0d34-0410-b5e6-96231b3b80d8
2016-01-06 05:01:34 +00:00
Sanjay Patel
9fcc06d338 A (B + C) = A B + A C ; NFCI
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256884 91177308-0d34-0410-b5e6-96231b3b80d8
2016-01-06 00:32:15 +00:00
Sanjay Patel
d79ef021fe [LibCallSimplfier] use instruction-level fast-math-flags for fmin/fmax transforms
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256871 91177308-0d34-0410-b5e6-96231b3b80d8
2016-01-05 20:46:19 +00:00
Sanjay Patel
e193ff319c [LibCallSimplifier] propagate FMF when shrinking binary calls
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256682 91177308-0d34-0410-b5e6-96231b3b80d8
2015-12-31 23:40:59 +00:00
Sanjay Patel
2e3f468f86 [LibCallSimplifier] propagate FMF when shrinking unary calls
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256679 91177308-0d34-0410-b5e6-96231b3b80d8
2015-12-31 21:52:31 +00:00
Sanjay Patel
6622d8b812 Variable names start with an upper case letter; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256676 91177308-0d34-0410-b5e6-96231b3b80d8
2015-12-31 16:16:58 +00:00
Sanjay Patel
ad8bf7ce34 fix formatting; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256675 91177308-0d34-0410-b5e6-96231b3b80d8
2015-12-31 16:10:49 +00:00
Sanjay Patel
59dc7be11d getParent() ^ 3 == getModule() ; NFCI
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@255511 91177308-0d34-0410-b5e6-96231b3b80d8
2015-12-14 17:24:23 +00:00
Weiming Zhao
cc87069c31 [SimplifyLibCalls] Optimization for pow(x, n) where n is some constant
Summary:
    In order to avoid calling pow function we generate repeated fmul when n is a
    positive or negative whole number.
    
    For each exponent we pre-compute Addition Chains in order to minimize the no.
    of fmuls.
    Refer: http://wwwhomes.uni-bielefeld.de/achim/addition_chain.html
    
    We pre-compute addition chains for exponents upto 32 (which results in a max of
    7 fmuls).

    For eg:
    4 = 2+2
    5 = 2+3
    6 = 3+3 and so on
    
    Hence,
    pow(x, 4.0) ==> y = fmul x, x
                    x = fmul y, y
                    ret x

    For negative exponents, we simply compute the reciprocal of the final result.
    
    Note: This transformation is only enabled under fast-math.
    
    Patch by Mandeep Singh Grang <mgrang@codeaurora.org>

Reviewers: weimingz, majnemer, escha, davide, scanon, joerg

Subscribers: probinson, escha, llvm-commits

Differential Revision: http://reviews.llvm.org/D13994

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254776 91177308-0d34-0410-b5e6-96231b3b80d8
2015-12-04 22:00:47 +00:00
Davide Italiano
24c91af18b [SimplifyLibCalls] Transform log(exp2(y)) to y*log(2) under fast-math.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254317 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-30 19:36:35 +00:00
Davide Italiano
401b67d4eb [SimplifyLibCalls] Don't crash if the function doesn't have a name.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254265 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-29 21:58:56 +00:00
Davide Italiano
276f2af536 [SimplifyLibCalls] Cross out implemented transformations.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254264 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-29 21:00:43 +00:00
Davide Italiano
0f019d6283 [SimplifyLibCalls] Tranform log(pow(x, y)) -> y*log(x).
This one is enabled only under -ffast-math. There are cases where the
difference between the value computed and the correct value is huge
even for ffast-math, e.g. as Steven pointed out:

x = -1, y = -4
log(pow(-1), 4) = 0
4*log(-1) = NaN

I checked what GCC does and apparently they do the same optimization
(which result in the dramatic difference). Future work might try to
make this (slightly) less worse.

Differential Revision:	http://reviews.llvm.org/D14400


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254263 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-29 20:58:04 +00:00
Davide Italiano
46cdbe2048 [SimplifyLibCalls] Use any_of(). Suggested by David Blaikie!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254239 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-28 22:27:48 +00:00
Benjamin Kramer
d3af7cc9d9 [SimplifyLibCalls] Fix inverted condition that lead to an uninitialized memory read below.
Found by msan!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254238 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-28 21:43:12 +00:00
Davide Italiano
2748acd415 [SimplifyLibCalls] Use range-based loop. NFC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254193 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-27 08:05:40 +00:00
Benjamin Kramer
7c7d1ee4c2 [SimplifyLibCalls] Don't depend on a called function having a name, it might be an indirect call.
Fixes the crasher in PR25651 and related crashers using the same pattern.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254145 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-26 09:51:17 +00:00
Weiming Zhao
a8a4b7cd81 [Utils] Put includes in correct order. NFC.
Summary:
    Followed the guidelines in:
    http://llvm.org/docs/CodingStandards.html#include-style
    
    However, I noticed that uppercase named headers come before lowercase ones
    throughout the codebase. So kept them as is.
    
    Patch by Mandeep Singh Grang <mgrang@codeaurora.org>

Reviewers: majnemer, davide, jmolloy, atrick

Subscribers: sanjoy

Differential Revision: http://reviews.llvm.org/D14939

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254005 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-24 18:57:06 +00:00
Weiming Zhao
0bf5b5cfb8 [SimplifyLibCalls] Removed some TODOs which are already implemented. NFC.
Summary:
D14302 implements tan(atan(x)) -> x
D14045 implements pow(exp(x), y) -> exp(x*y)

Patch by Mandeep Singh Grang <mgrang@codeaurora.org>

Reviewers: majnemer, davide

Differential Revision: http://reviews.llvm.org/D14882

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253768 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-21 06:10:20 +00:00
Pete Cooper
6d024c616a Revert "Change memcpy/memset/memmove to have dest and source alignments."
This reverts commit r253511.

This likely broke the bots in
http://lab.llvm.org:8011/builders/clang-ppc64-elf-linux2/builds/20202
http://bb.pgr.jp/builders/clang-3stage-i686-linux/builds/3787

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253543 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-19 05:56:52 +00:00
Davide Italiano
b8dd4a3d67 [SimplifyLibCalls] New trick: pow(x, 0.5) -> sqrt(x) under -ffast-math.
Differential Revision:	http://reviews.llvm.org/D14466


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253521 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-18 23:21:32 +00:00
Pete Cooper
8b170f7f29 Change memcpy/memset/memmove to have dest and source alignments.
Note, this was reviewed (and more details are in) http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20151109/312083.html

These intrinsics currently have an explicit alignment argument which is
required to be a constant integer.  It represents the alignment of the
source and dest, and so must be the minimum of those.

This change allows source and dest to each have their own alignments
by using the alignment attribute on their arguments.  The alignment
argument itself is removed.

There are a few places in the code for which the code needs to be
checked by an expert as to whether using only src/dest alignment is
safe.  For those places, they currently take the minimum of src/dest
alignments which matches the current behaviour.

For example, code which used to read:
  call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 500, i32 8, i1 false)
will now read:
  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %dest, i8* align 8 %src, i32 500, i1 false)

For out of tree owners, I was able to strip alignment from calls using sed by replacing:
  (call.*llvm\.memset.*)i32\ [0-9]*\,\ i1 false\)
with:
  $1i1 false)

and similarly for memmove and memcpy.

I then added back in alignment to test cases which needed it.

A similar commit will be made to clang which actually has many differences in alignment as now
IRBuilder can generate different source/dest alignments on calls.

In IRBuilder itself, a new argument was added.  Instead of calling:
  CreateMemCpy(Dst, Src, getInt64(Size), DstAlign, /* isVolatile */ false)
you now call
  CreateMemCpy(Dst, Src, getInt64(Size), DstAlign, SrcAlign, /* isVolatile */ false)

There is a temporary class (IntegerAlignment) which takes the source alignment and rejects
implicit conversion from bool.  This is to prevent isVolatile here from passing its default
parameter to the source alignment.

Note, changes in future can now be made to codegen.  I didn't change anything here, but this
change should enable better memcpy code sequences.

Reviewed by Hal Finkel.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253511 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-18 22:17:24 +00:00
Davide Italiano
6736b2f9fa [SimplifyLibCalls] Generalize a comment. This doesn't apply only to sqrt.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253224 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-16 16:54:28 +00:00
Davide Italiano
e4296ea350 [SimplifyLibCalls] Make a function shorter. NFC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252970 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-12 23:39:00 +00:00
Davide Italiano
b418909313 [SimplifyLibCalls] Don't hardcode the function name.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252342 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-06 21:05:07 +00:00
Davide Italiano
c18c3b8a30 [SimplifyLibCalls] Use hasFloatVersion(). NFCI.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252186 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-05 19:18:23 +00:00
Davide Italiano
9496ef1fef [SimplifyLibCalls] New transformation: tan(atan(x)) -> x
This is enabled only under -ffast-math.
So, instead of emitting:
  4007b0:       50                      push   %rax
  4007b1:       e8 8a fd ff ff          callq  400540 <atanf@plt>
  4007b6:       58                      pop    %rax
  4007b7:       e9 94 fd ff ff          jmpq   400550 <tanf@plt>
  4007bc:       0f 1f 40 00             nopl   0x0(%rax)

for:
float mytan(float x) {
  return tanf(atanf(x));
}
we emit a single retq.

Differential Revision:	 http://reviews.llvm.org/D14302


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252098 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-04 23:36:56 +00:00
Davide Italiano
1b506d8aa4 [SimplifyLibCalls] Add a new transformation: pow(exp(x), y) -> exp(x*y)
This one is enabled only under -ffast-math (due to rounding/overflows)
but allows us to emit shorter code.

Before (on FreeBSD x86-64):
4007f0:       50                      push   %rax
4007f1:       f2 0f 11 0c 24          movsd  %xmm1,(%rsp)
4007f6:       e8 75 fd ff ff          callq  400570 <exp2@plt>
4007fb:       f2 0f 10 0c 24          movsd  (%rsp),%xmm1
400800:       58                      pop    %rax
400801:       e9 7a fd ff ff          jmpq   400580 <pow@plt>
400806:       66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
40080d:       00 00 00

After:
4007b0:       f2 0f 59 c1             mulsd  %xmm1,%xmm0
4007b4:       e9 87 fd ff ff          jmpq   400540 <exp2@plt>
4007b9:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)

Differential Revision:	http://reviews.llvm.org/D14045


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251976 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-03 20:32:23 +00:00
Davide Italiano
e8e35e60d8 [SimplifyLibCalls] Remove variables that are not used. NFC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251852 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-02 23:07:14 +00:00
Davide Italiano
256403a9af [SimplifyLibCalls] Merge two if statements. NFC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251845 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-02 22:33:26 +00:00
Davide Italiano
4784e1362f Simplify a check. NFC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251757 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-01 00:09:16 +00:00
Davide Italiano
7e5269ed6d [SimplifyLibCalls] Factor out other common code.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251754 91177308-0d34-0410-b5e6-96231b3b80d8
2015-10-31 23:17:45 +00:00
Davide Italiano
e798009f10 [SimplifyLibCalls] Remove dead code.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251737 91177308-0d34-0410-b5e6-96231b3b80d8
2015-10-31 08:28:10 +00:00
Davide Italiano
12c4ab6c83 [SimplifyLibCalls] Factor out common unsafe-math checks.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251595 91177308-0d34-0410-b5e6-96231b3b80d8
2015-10-29 02:58:44 +00:00
Davide Italiano
ffc19a06be [SimplifyLibCalls] Use range-based loop. No functional change.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251383 91177308-0d34-0410-b5e6-96231b3b80d8
2015-10-27 04:17:51 +00:00
Duncan P. N. Exon Smith
5270f8871a TransformUtils: Remove implicit ilist iterator conversions, NFC
Continuing the work from last week to remove implicit ilist iterator
conversions.  First related commit was probably r249767, with some more
motivation in r249925.  This edition gets LLVMTransformUtils compiling
without the implicit conversions.

No functional change intended.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@250142 91177308-0d34-0410-b5e6-96231b3b80d8
2015-10-13 02:39:05 +00:00
Bruno Cardoso Lopes
e054b9463a [SimplifyLibCalls] Fix instruction misplacement in string/memory libcall optimization
When trying to optimize fortified library functions use the right
location to insert new instructions in order to preserve correct
def-use order.

This fixes an issue where a misplaced instruction definition would
happen to be *after* one of its use after a RAUW, forming invalid IR.
This behavior was introduced by r227250.

Differential Revision: http://reviews.llvm.org/D13301

rdar://problem/22802369

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@249092 91177308-0d34-0410-b5e6-96231b3b80d8
2015-10-01 22:43:53 +00:00
NAKAMURA Takumi
c315a08fee Prune utf8 chars in comments.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@246953 91177308-0d34-0410-b5e6-96231b3b80d8
2015-09-07 00:26:54 +00:00
Chad Rosier
55189b7fca Optimize memcmp(x,y,n)==0 for small n and suitably aligned x/y.
http://reviews.llvm.org/D6952
PR20673

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@246313 91177308-0d34-0410-b5e6-96231b3b80d8
2015-08-28 18:30:18 +00:00
David Majnemer
d4213e9ee8 [SimplifyLibCalls] Fix a typo
cbrt(sqrt(x)) calculates the sixth root, not the ninth root.
cbrt(cbrt(x)) calculates the ninth root.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@246046 91177308-0d34-0410-b5e6-96231b3b80d8
2015-08-26 18:30:16 +00:00
Benjamin Kramer
21b0266600 [SimplifyLibCalls] Drop default template args. No functional change.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245189 91177308-0d34-0410-b5e6-96231b3b80d8
2015-08-16 21:16:37 +00:00
Sanjay Patel
69ab373dfe transform fmin/fmax calls when possible (PR24314)
If we can ignore NaNs, fmin/fmax libcalls can become compare and select
(this is what we turn std::min / std::max into).

This IR should then be optimized in the backend to whatever is best for
any given target. Eg, x86 can use minss/maxss instructions.

This should solve PR24314:
https://llvm.org/bugs/show_bug.cgi?id=24314

Differential Revision: http://reviews.llvm.org/D11866


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245187 91177308-0d34-0410-b5e6-96231b3b80d8
2015-08-16 20:18:19 +00:00
Davide Italiano
d0a074c824 [SimplifyLibCalls] Correctly set the is_zero_undef flag for llvm.cttz
If <src> is non-zero we can safely set the flag to true, and this
results in less code generated for, e.g. ffs(x) + 1 on FreeBSD.
Thanks to majnemer for suggesting the fix and reviewing.

Code generated before the patch was applied:


 0:   0f bc c7                bsf    %edi,%eax
 3:   b9 20 00 00 00          mov    $0x20,%ecx
 8:   0f 45 c8                cmovne %eax,%ecx
 b:   83 c1 02                add    $0x2,%ecx
 e:   b8 01 00 00 00          mov    $0x1,%eax
13:   85 ff                   test   %edi,%edi
15:   0f 45 c1                cmovne %ecx,%eax
18:   c3                      retq

Code generated after the patch was applied:

 0:   0f bc cf                bsf    %edi,%ecx
 3:   83 c1 02                add    $0x2,%ecx
 6:   85 ff                   test   %edi,%edi
 8:   b8 01 00 00 00          mov    $0x1,%eax
 d:   0f 45 c1                cmovne %ecx,%eax
10:   c3                      retq

It seems we can still use cmove and save another 'test' instruction, but
that can be tackled separately.

Differential Revision:  http://reviews.llvm.org/D11989	


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244947 91177308-0d34-0410-b5e6-96231b3b80d8
2015-08-13 20:34:26 +00:00
Sanjay Patel
18ceb87778 fix typo; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244805 91177308-0d34-0410-b5e6-96231b3b80d8
2015-08-12 20:36:18 +00:00
Pete Cooper
9584e07a9c Change Function::getIntrinsicID() to return an Intrinsic::ID. NFC.
Now that Intrinsic::ID is a typed enum, we can forward declare it and so return it from this method.

This updates all users which were either using an unsigned to store it, or had a now unnecessary cast.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237810 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-20 17:16:39 +00:00
David Blaikie
042dd34f9c Simplify IRBuilder::CreateCall* by using ArrayRef+initializer_list/braced init only
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237624 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-18 22:13:54 +00:00
David Blaikie
4a86b381a3 [opaque pointer type] More GEP IRBuilder API migrations...
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@234058 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-03 21:33:42 +00:00
David Blaikie
4615ac61c5 Use early returns to reduce indentation.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@234057 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-03 21:32:06 +00:00
Ahmed Bougacha
252c120f4a [SimplifyLibCalls] Ignore nobuiltin/unavailable fortified libcalls.
We used to do this before refactorings around r225640.
Some clang users checked for _chk libcall availability using:
  __has_builtin(__builtin___memcpy_chk)
When compiling with -fno-builtin, this is always true.
When passing -ffreestanding/-mkernel, which both imply -fno-builtin, we
end up with fortified libcalls, which isn't acceptable in a freestanding
environment which only provides their non-fortified counterparts.

Until we change clang and/or teach external users to check for availability
differently, disregard the "nobuiltin" attribute and TLI::has.

Workaround for PR23093.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@233776 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-01 00:45:09 +00:00