Chandler Carruth [Wed, 23 Jul 2014 07:08:53 +0000 (07:08 +0000)]
[SDAG] Make the DAGCombine worklist not grow endlessly due to duplicate
insertions.
The old behavior could cause arbitrarily bad memory usage in the DAG
combiner if there was heavy traffic of adding nodes already on the
worklist to it. This commit switches the DAG combine worklist to work
the same way as the instcombine worklist where we null-out removed
entries and only add new entries to the worklist. My measurements of
codegen time shows slight improvement. The memory utilization is
unsurprisingly dominated by other factors (the IR and DAG itself
I suspect).
This change results in subtle, frustrating churn in the particular order
in which DAG combines are applied which causes a number of minor
regressions where we fail to match a pattern previously matched by
accident. AFAICT, all of these should be using AddToWorklist to directly
or should be written in a less brittle way. None of the changes seem
drastically bad, and a few of the changes seem distinctly better.
A major change required to make this work is to significantly harden the
way in which the DAG combiner handle nodes which become dead
(zero-uses). Previously, we relied on the ability to "priority-bump"
them on the combine worklist to achieve recursive deletion of these
nodes and ensure that the frontier of remaining live nodes all were
added to the worklist. Instead, I've introduced a routine to just
implement that precise logic with no indirection. It is a significantly
simpler operation than that of the combiner worklist proper. I suspect
this will also fix some other problems with the combiner.
I think the x86 changes are really minor and uninteresting, but the
avx512 change at least is hiding a "regression" (despite the test case
being just noise, not testing some performance invariant) that might be
looked into. Not sure if any of the others impact specific "important"
code paths, but they didn't look terribly interesting to me, or the
changes were really minor. The consensus in review is to fix any
regressions that show up after the fact here.
Thanks to the other reviewers for checking the output on other
architectures. There is a specific regression on ARM that Tim already
has a fix prepped to commit.
Differential Revision: http://reviews.llvm.org/D4616
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213727
91177308-0d34-0410-b5e6-
96231b3b80d8
Nick Lewycky [Wed, 23 Jul 2014 06:24:49 +0000 (06:24 +0000)]
We may visit a call that uses an alloca multiple times in callUsesLocalStack, sometimes with IsNocapture true and sometimes with IsNocapture false. We accidentally skipped work we needed to do in the IsNocapture=false case if we were called with IsNocapture=true the first time. Fixes PR20405!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213726
91177308-0d34-0410-b5e6-
96231b3b80d8
NAKAMURA Takumi [Wed, 23 Jul 2014 04:32:21 +0000 (04:32 +0000)]
Rework to let RuntimeDyld/X86/MachO_x86-64_PIC_relocations.s pass on win32.
FIXME: "llvm-rtdyld -verify -check" is still sensitive to path separator.
Fix searching StubMap to be tolerant of both '/' and '\\' on Win32.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213723
91177308-0d34-0410-b5e6-
96231b3b80d8
NAKAMURA Takumi [Wed, 23 Jul 2014 04:05:58 +0000 (04:05 +0000)]
Suppress a test on win32 for now, llvm/test/ExecutionEngine/RuntimeDyld/X86/MachO_x86-64_PIC_relocations.s.
FIXME: Fix searching StubMap with '/' and '\\' on Win32.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213721
91177308-0d34-0410-b5e6-
96231b3b80d8
NAKAMURA Takumi [Wed, 23 Jul 2014 04:05:46 +0000 (04:05 +0000)]
RuntimeDyld/X86/MachO_x86-64_PIC_relocations.s: Use %/T here, or sed(1) would be confused with dos path.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213720
91177308-0d34-0410-b5e6-
96231b3b80d8
NAKAMURA Takumi [Wed, 23 Jul 2014 00:42:52 +0000 (00:42 +0000)]
Trailing whitespace.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213711
91177308-0d34-0410-b5e6-
96231b3b80d8
NAKAMURA Takumi [Wed, 23 Jul 2014 00:17:44 +0000 (00:17 +0000)]
RuntimeDyldMachOAArch64.h: Fix a warning. [-Wunused-variable]
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213710
91177308-0d34-0410-b5e6-
96231b3b80d8
Lang Hames [Tue, 22 Jul 2014 23:50:51 +0000 (23:50 +0000)]
[MCJIT] Make stub_addr functionality in RuntimeDyldChecker work in release mode.
There's no reason to restrict this particular piece of RuntimeDyldChecker
functionality to +Asserts builds.
This should fix failures in MachO_x86-64_PIC_relocations.s on release bots.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213708
91177308-0d34-0410-b5e6-
96231b3b80d8
Lang Hames [Tue, 22 Jul 2014 23:17:21 +0000 (23:17 +0000)]
[MCJIT] Teach RuntimeDyldChecker to handle underscores at the start of symbols.
RuntimeDyldChecker had been testing isalpha(Expr[0]) to recognise symbol tokens,
and throwing unrecognized token errors when it hit symbols with leading
underscores. This fixes that.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213706
91177308-0d34-0410-b5e6-
96231b3b80d8
Juergen Ributzka [Tue, 22 Jul 2014 23:15:01 +0000 (23:15 +0000)]
XFAIL the test on MIPS
Not sure how to debug this one without a MIPS machine. Any takers?
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213705
91177308-0d34-0410-b5e6-
96231b3b80d8
Juergen Ributzka [Tue, 22 Jul 2014 23:14:58 +0000 (23:14 +0000)]
[FastIsel][AArch64] Add support for the FastLowerCall and FastLowerIntrinsicCall target-hooks.
This commit modifies the existing call lowering functions to be used as the
FastLowerCall and FastLowerIntrinsicCall target-hooks instead.
This enables patchpoint intrinsic lowering for AArch64.
This fixes <rdar://problem/
17733076>
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213704
91177308-0d34-0410-b5e6-
96231b3b80d8
Juergen Ributzka [Tue, 22 Jul 2014 23:14:54 +0000 (23:14 +0000)]
[AArch64] Use CHECK-LABEL in ARM64 ABI unit tests.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213703
91177308-0d34-0410-b5e6-
96231b3b80d8
Lang Hames [Tue, 22 Jul 2014 23:07:52 +0000 (23:07 +0000)]
[MCJIT] Improve stub_addr file-not-found diagnostic to help track down a
buildbot failure.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213701
91177308-0d34-0410-b5e6-
96231b3b80d8
Lang Hames [Tue, 22 Jul 2014 22:47:39 +0000 (22:47 +0000)]
[MCJIT] Refactor and add stub inspection to the RuntimeDyldChecker framework.
This patch introduces a 'stub_addr' builtin that can be used to find the address
of the stub for a given (<file>, <section>, <symbol>) tuple. This address can be
used both to verify the contents of stubs (by loading from the returned address)
and to verify references to stubs (by comparing against the returned address).
Example (1) - Verifying stub contents:
Load 8 bytes (assuming a 64-bit target) from the stub for 'x' in the __text
section of f.o, and compare that value against the addres of 'x'.
# rtdyld-check: *{8}(stub_addr(f.o, __text, x) = x
Example (2) - Verifying references to stubs:
Decode the immediate of the instruction at label 'l', and verify that it's
equal to the offset from the next instruction's PC to the stub for 'y' in the
__text section of f.o (i.e. it's the correct PC-rel difference).
# rtdyld-check: decode_operand(l, 4) = stub_addr(f.o, __text, y) - next_pc(l)
l:
movq y@GOTPCREL(%rip), %rax
Since stub inspection requires cooperation with RuntimeDyldImpl this patch
pimpl-ifies RuntimeDyldChecker. Its implementation is moved in to a new class,
RuntimeDyldCheckerImpl, that has access to the definition of RuntimeDyldImpl.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213698
91177308-0d34-0410-b5e6-
96231b3b80d8
Juergen Ributzka [Tue, 22 Jul 2014 22:02:19 +0000 (22:02 +0000)]
Appease the buildbots.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213694
91177308-0d34-0410-b5e6-
96231b3b80d8
Juergen Ributzka [Tue, 22 Jul 2014 21:42:55 +0000 (21:42 +0000)]
[RuntimeDyld][MachO][AArch64] Add a helper function for encoding addends in instructions.
Factor out the addend encoding into a helper function and simplify the
processRelocationRef.
Also add a few simple rtdyld tests. More tests to come once GOTs can be tested too.
Related to <rdar://problem/
17768539>
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213689
91177308-0d34-0410-b5e6-
96231b3b80d8
Juergen Ributzka [Tue, 22 Jul 2014 21:42:51 +0000 (21:42 +0000)]
[RuntimeDyld][MachO][AArch64] Implement the decodeAddend method.
This adds the required functionality to decode the immediate encoded in an
instruction that is referenced in a relocation entry.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213688
91177308-0d34-0410-b5e6-
96231b3b80d8
Juergen Ributzka [Tue, 22 Jul 2014 21:42:49 +0000 (21:42 +0000)]
[RuntimeDyld][MachO][AArch64] Add assertion to check for duplicate addend definition.
In MachO for AArch64 it is possible to have an explicit addend defined by
the ARM64_RELOC_ADDEND relocation or having an addend encoded within the
instruction. Only one of them are allowed per relocation.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213687
91177308-0d34-0410-b5e6-
96231b3b80d8
Juergen Ributzka [Tue, 22 Jul 2014 21:42:46 +0000 (21:42 +0000)]
[RuntimeDyld] Change the return type of decodeAddend to match the storage type.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213686
91177308-0d34-0410-b5e6-
96231b3b80d8
Suyog Sarda [Tue, 22 Jul 2014 19:19:36 +0000 (19:19 +0000)]
This patch implements optimization as mentioned in PR19753: Optimize comparisons with "ashr/lshr exact" of a constanst.
It handles the errors which were seen in PR19958 where wrong code was being emitted due to earlier patch.
Added code for lshr as well as non-exact right shifts.
It implements :
(icmp eq/ne (ashr/lshr const2, A), const1)" ->
(icmp eq/ne A, Log2(const2/const1)) ->
(icmp eq/ne A, Log2(const2) - Log2(const1))
Differential Revision: http://reviews.llvm.org/D4068
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213678
91177308-0d34-0410-b5e6-
96231b3b80d8
Suyog Sarda [Tue, 22 Jul 2014 18:30:54 +0000 (18:30 +0000)]
Added InstCombine transform for pattern "(A & B) ^ (A ^ B) -> (A | B)"
Patch idea by Ankit Jain !
Differential Revision: http://reviews.llvm.org/D4618
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213677
91177308-0d34-0410-b5e6-
96231b3b80d8
Suyog Sarda [Tue, 22 Jul 2014 18:09:41 +0000 (18:09 +0000)]
Added InstCombine Transform for patterns:
"((~A & B) | A) -> (A | B)" and "((A & B) | ~A) -> (~A | B)"
Original Patch credit to Ankit Jain !!
Differential Revision: http://reviews.llvm.org/D4591
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213676
91177308-0d34-0410-b5e6-
96231b3b80d8
Dan Liew [Tue, 22 Jul 2014 18:09:17 +0000 (18:09 +0000)]
Revert "Treat warnings in Sphinx as errors. The reasons for doing this are..."
This reverts commit r213661.
Reverting at the request of Sean Silva.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213675
91177308-0d34-0410-b5e6-
96231b3b80d8
Dan Liew [Tue, 22 Jul 2014 17:48:51 +0000 (17:48 +0000)]
Add LLVM_TOOLS_BINARY_DIR variable to LLVMConfig.cmake so clients
of LLVM using CMake can easily find the tools directory.
LLVM_BUILD_TOOLS_BINARY_DIR was removed because it is now
superfluous.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213674
91177308-0d34-0410-b5e6-
96231b3b80d8
Alexey Samsonov [Tue, 22 Jul 2014 17:46:09 +0000 (17:46 +0000)]
[ASan] Fix comments about __sanitizer_cov function
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213673
91177308-0d34-0410-b5e6-
96231b3b80d8
Hal Finkel [Tue, 22 Jul 2014 16:58:55 +0000 (16:58 +0000)]
Make use of the align parameter attribute for all pointer arguments
We previously supported the align attribute on all (pointer) parameters, but we
only used it for byval parameters. However, it is completely consistent at the
IR level to treat 'align n' on all pointer parameters as an alignment
assumption on the pointer, and now we wll. Specifically, this causes
computeKnownBits to use the align attribute on all pointer parameters, not just
byval parameters. I've also added an explicit parameter attribute test for this
to test/Bitcode/attributes.ll.
And I've updated the LangRef to document the align parameter attribute (as it
turns out, it was not documented at all previously, although the byval
documentation mentioned that it could be used).
There are (at least) two benefits to doing this:
- It allows enhancing alignment based on the pointer alignment after inlining callees.
- It allows simplification of pointer arithmetic.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213670
91177308-0d34-0410-b5e6-
96231b3b80d8
Tim Northover [Tue, 22 Jul 2014 15:47:09 +0000 (15:47 +0000)]
X86: drop relocations on __eh_frame sections globally.
Without this, we produce non-extern relocations when targeting older OS X
versions that ld64 can't cope with in the particular context of __eh_frame
sections (who'd want generic relocation-processing anyway?).
This means that an updated linker (ld64 from Xcode 3.2.6 or later) may be
needed when targeting such platforms with a modern version of LLVM, but this is
probably the case anyway and a reasonable requirement.
PR20212, rdar://problem/
17544795
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213665
91177308-0d34-0410-b5e6-
96231b3b80d8
Dan Liew [Tue, 22 Jul 2014 15:41:33 +0000 (15:41 +0000)]
Export LLVM_ENABLE_RTTI and LLVM_ENABLE_EH in LLVMConfig.cmake so
clients of LLVM know if RTTI and/or EH were enabled in the build of
LLVM they are trying to link against.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213664
91177308-0d34-0410-b5e6-
96231b3b80d8
Dan Liew [Tue, 22 Jul 2014 15:41:18 +0000 (15:41 +0000)]
Added LLVM_ENABLE_RTTI and LLVM_ENABLE_EH options that allow RTTI and EH
to globally be controlled. Individual targets (e.g. ExceptionDemo) can
still override this by using LLVM_REQUIRE_RTTI and LLVM_REQUIRE_EH if
they need to be compiled with RTTI or exception handling respectively.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213663
91177308-0d34-0410-b5e6-
96231b3b80d8
Suyog Sarda [Tue, 22 Jul 2014 15:37:39 +0000 (15:37 +0000)]
This patch implements transform for pattern "(A | B) ^ (~A) -> (A | ~B)".
Patch Credit to Ankit Jain !!
Differential Revision: http://reviews.llvm.org/D4588
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213662
91177308-0d34-0410-b5e6-
96231b3b80d8
Dan Liew [Tue, 22 Jul 2014 15:07:35 +0000 (15:07 +0000)]
Treat warnings in Sphinx as errors. The reasons for doing this are...
- When CMake builds the documentation with sphinx-build it treats
warnings as errors. We should be consistent with what we do in
CMake.
- Having warnings treated as errors will hopefully encourage
developers to write documentation correctly.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213661
91177308-0d34-0410-b5e6-
96231b3b80d8
Dan Liew [Tue, 22 Jul 2014 14:59:38 +0000 (14:59 +0000)]
Fix Sphinx warning.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213660
91177308-0d34-0410-b5e6-
96231b3b80d8
Peter Zotov [Tue, 22 Jul 2014 13:55:20 +0000 (13:55 +0000)]
[OCaml] Don't truncate constants over 32 bits in Llvm.const_int.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213655
91177308-0d34-0410-b5e6-
96231b3b80d8
Sasa Stankovic [Tue, 22 Jul 2014 13:36:02 +0000 (13:36 +0000)]
[mips] Fix two patterns that select i32's (for MIPS32r6) / i64's (for MIPS64r6)
from setne comparison with an i32.
The patterns that are fixed:
* (select (i32 (setne i32, immZExt16)), i32, i32) (for MIPS32r6)
* (select (i32 (setne i32, immZExt16)), i64, i64) (for MIPS64r6)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213653
91177308-0d34-0410-b5e6-
96231b3b80d8
Elena Demikhovsky [Tue, 22 Jul 2014 11:07:31 +0000 (11:07 +0000)]
AVX-512: Fixed intrinsic of VSQRTPS/PD instructions.
I set number and types of parameters according to GCC intrinsics.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213640
91177308-0d34-0410-b5e6-
96231b3b80d8
Sanjay Patel [Tue, 22 Jul 2014 04:57:06 +0000 (04:57 +0000)]
fixed typo in comment
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213614
91177308-0d34-0410-b5e6-
96231b3b80d8
Chandler Carruth [Tue, 22 Jul 2014 04:07:55 +0000 (04:07 +0000)]
[SDAG] Refactor the code for inserting a newly allocated SDNode into the
DAG into a helper function.
This adds a trip through the (very minimal) verification logic in
a bunch of places that were missing it, but shouldn't have any other
impact outside of refactoring. I'm hoping to use this to do more clever
things when DAG nodes are inserted into the graph.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213612
91177308-0d34-0410-b5e6-
96231b3b80d8
Chandler Carruth [Tue, 22 Jul 2014 04:03:22 +0000 (04:03 +0000)]
[SDAG] Remove a giant pile of asserts that may have helped track down
a bug in 2010 when they were added but are adding no value today.
In fact, they are utter lies. NodeAllocator is used to allocate almost
all of these node types. I don't know what we were trying to assert
here, and the docs don't give any answer. Until we once again stumble
upon a bug needing help, let's clear the path for improvements.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213610
91177308-0d34-0410-b5e6-
96231b3b80d8
Bill Wendling [Tue, 22 Jul 2014 03:17:30 +0000 (03:17 +0000)]
Add openmp to the list of tagged things.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213608
91177308-0d34-0410-b5e6-
96231b3b80d8
Richard Smith [Tue, 22 Jul 2014 02:32:12 +0000 (02:32 +0000)]
Revert of r213521. This change introduced a non-hermetic test (depending on a
file not in the test/ area). Backing out now so that this test isn't part of
the 3.5 branch.
Original commit message: "TableGen: Allow AddedComplexity values to be negative
[...]"
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213596
91177308-0d34-0410-b5e6-
96231b3b80d8
Mark Heffernan [Mon, 21 Jul 2014 23:11:03 +0000 (23:11 +0000)]
Rename metadata llvm.loop.vectorize.unroll to llvm.loop.vectorize.interleave.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213588
91177308-0d34-0410-b5e6-
96231b3b80d8
Eli Bendersky [Mon, 21 Jul 2014 22:54:44 +0000 (22:54 +0000)]
Add some tests for NVPTX lowering of cmpxchg
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213586
91177308-0d34-0410-b5e6-
96231b3b80d8
Hal Finkel [Mon, 21 Jul 2014 21:30:22 +0000 (21:30 +0000)]
Match semantics of PointerMayBeCapturedBefore to its name by default
As it turns out, the capture tracker named CaptureBefore used by AA, and now
available via the PointerMayBeCapturedBefore function, would have been
more-aptly named CapturedBeforeOrAt, because it considers captures at the
instruction provided. This is not always what one wants, and it is difficult to
get the strictly-before behavior given only the current interface. This adds an
additional parameter which controls whether or not you want to include
captures at the provided instruction. The default is not to include the
instruction provided, so that 'Before' matches its name.
No functionality change intended.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213582
91177308-0d34-0410-b5e6-
96231b3b80d8
David Blaikie [Mon, 21 Jul 2014 20:45:59 +0000 (20:45 +0000)]
Revert "Recommit r212203: Don't try to construct debug LexicalScopes hierarchy for functions that do not have top level debug information."
This reverts commit r212649 while I investigate/reduce/etc PR20367.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213581
91177308-0d34-0410-b5e6-
96231b3b80d8
Tom Stellard [Mon, 21 Jul 2014 20:20:08 +0000 (20:20 +0000)]
test-release.sh: Add support for dot releases
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213580
91177308-0d34-0410-b5e6-
96231b3b80d8
Saleem Abdulrasool [Mon, 21 Jul 2014 17:52:00 +0000 (17:52 +0000)]
R600: silence GCC warning
GCC believes it may be possible to not return a value from the switch:
lib/Target/R600/SIRegisterInfo.cpp:187:1: warning: control reaches end of non-void function [-Wreturn-type]
Add an unreachable label to indicate that this is not possible and still permit
switch coverage checking.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213572
91177308-0d34-0410-b5e6-
96231b3b80d8
Tom Stellard [Mon, 21 Jul 2014 17:44:29 +0000 (17:44 +0000)]
R600/SI: Refactor VOP3 instruction definitions
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213571
91177308-0d34-0410-b5e6-
96231b3b80d8
Tom Stellard [Mon, 21 Jul 2014 17:44:28 +0000 (17:44 +0000)]
R600/SI: Separate encoding and operand definitions into their own classes
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213570
91177308-0d34-0410-b5e6-
96231b3b80d8
Logan Chien [Mon, 21 Jul 2014 17:33:44 +0000 (17:33 +0000)]
Replace the result usages while legalizing cmpxchg.
We should update the usages to all of the results;
otherwise, we might get assertion failure or SEGV during
the type legalization of ATOMIC_CMP_SWAP_WITH_SUCCESS
with two or more illegal types.
For example, in the following sequence, both i8 and i1
might be illegal in some target, e.g. armv5, mipsel, mips64el,
%0 = cmpxchg i8* %ptr, i8 %desire, i8 %new monotonic monotonic
%1 = extractvalue { i8, i1 } %0, 1
Since both i8 and i1 should be legalized, the corresponding
ATOMIC_CMP_SWAP_WITH_SUCCESS dag will be checked/replaced/updated
twice.
If we don't update the usage to *ALL* of the results in the
first round, the DAG for extractvalue might be processed earlier.
The GetPromotedInteger() will result in assertion failure,
because its operand (i.e. the success bit of cmpxchg) is not
promoted beforehand.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213569
91177308-0d34-0410-b5e6-
96231b3b80d8
Tom Stellard [Mon, 21 Jul 2014 17:12:40 +0000 (17:12 +0000)]
R600/SI: Initailize encoding fields of unused VOP3 modifiers to 0
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213564
91177308-0d34-0410-b5e6-
96231b3b80d8
Tom Stellard [Mon, 21 Jul 2014 17:12:37 +0000 (17:12 +0000)]
R600/SI: Initialize unused VOP3 sources to 0 instead of SIOperand.ZERO
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213563
91177308-0d34-0410-b5e6-
96231b3b80d8
Duncan P. N. Exon Smith [Mon, 21 Jul 2014 17:06:51 +0000 (17:06 +0000)]
Revert "[C++11] Add predecessors(BasicBlock *) / successors(BasicBlock *) iterator ranges."
This reverts commit r213474 (and r213475), which causes a miscompile on
a stage2 LTO build. I'll reply on the list in a moment.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213562
91177308-0d34-0410-b5e6-
96231b3b80d8
Tom Stellard [Mon, 21 Jul 2014 16:55:33 +0000 (16:55 +0000)]
R600/SI: Add instruction shrinking pass
This pass converts 64-bit instructions to 32-bit when possible.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213561
91177308-0d34-0410-b5e6-
96231b3b80d8
Dan Liew [Mon, 21 Jul 2014 16:39:00 +0000 (16:39 +0000)]
Fix Sphinx warnings.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213559
91177308-0d34-0410-b5e6-
96231b3b80d8
Tom Stellard [Mon, 21 Jul 2014 16:27:24 +0000 (16:27 +0000)]
R600/SI: VOPC instructions explicitly define VCC
Therefore we don't need to add it to the implict defs list.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213558
91177308-0d34-0410-b5e6-
96231b3b80d8
David Blaikie [Mon, 21 Jul 2014 16:26:24 +0000 (16:26 +0000)]
Correct the ownership passing semantics of object::createBinary and make them explicit in the type system.
createBinary documented that it destroyed the parameter in error cases,
though by observation it does not. By passing the unique_ptr by value
rather than lvalue reference, callers are now explicit about passing
ownership and the function implements the documented contract. Remove
the explicit documentation, since now the behavior cannot be anything
other than what was documented, so it's redundant.
Also drops a unique_ptr::release in llvm-nm that was always run on a
null unique_ptr anyway.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213557
91177308-0d34-0410-b5e6-
96231b3b80d8
David Blaikie [Mon, 21 Jul 2014 16:23:21 +0000 (16:23 +0000)]
Remove unnecessary use of unique_ptr::release() used to construct another unique_ptr.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213556
91177308-0d34-0410-b5e6-
96231b3b80d8
David Blaikie [Mon, 21 Jul 2014 16:13:24 +0000 (16:13 +0000)]
Remove unused variable.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213554
91177308-0d34-0410-b5e6-
96231b3b80d8
Tom Stellard [Mon, 21 Jul 2014 15:45:06 +0000 (15:45 +0000)]
R600/SI: Clean up some of the unused REGISTER_{LOAD,STORE} code
There are a few more cleanups to do, but I ran into some problems
with ext loads and trunc stores, when I tried to change some of the
vector loads and stores from custom to legal, so I wasn't able to
get rid of everything.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213552
91177308-0d34-0410-b5e6-
96231b3b80d8
Tom Stellard [Mon, 21 Jul 2014 15:45:01 +0000 (15:45 +0000)]
R600/SI: Use scratch memory for large private arrays
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213551
91177308-0d34-0410-b5e6-
96231b3b80d8
Tom Stellard [Mon, 21 Jul 2014 15:44:58 +0000 (15:44 +0000)]
R600/SI: Specify wavefront size for SI and CI
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213550
91177308-0d34-0410-b5e6-
96231b3b80d8
Tom Stellard [Mon, 21 Jul 2014 15:44:55 +0000 (15:44 +0000)]
R600/SI: Remove vaddr operand from BUFFER_LOAD_*_OFFSET instructions
This operand is never used.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213549
91177308-0d34-0410-b5e6-
96231b3b80d8
Daniel Sanders [Mon, 21 Jul 2014 15:25:24 +0000 (15:25 +0000)]
[mips] Do not emit '.module fp=...' unless we really need to.
We now emit this value when we need to contradict the default value. This
restores support for binutils 2.24.
When a suitable binutils has been released we can resume unconditionally
emitting .module directives. This is preferable to omitting the .module
directives since the .module directives protect against, for example,
accidentally assembling FP32 code with -mfp64 and producing an unusuable object.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213548
91177308-0d34-0410-b5e6-
96231b3b80d8
Robert Khasanov [Mon, 21 Jul 2014 14:54:21 +0000 (14:54 +0000)]
[SKX] Enabling SKX target and AVX512BW, AVX512DQ, AVX512VL features.
Enabling HasAVX512{DQ,BW,VL} predicates.
Adding VK2, VK4, VK32, VK64 masked register classes.
Adding new types (v64i8, v32i16) to VR512.
Extending calling conventions for new types (v64i8, v32i16)
Patch by Zinovy Nis <zinovy.y.nis@intel.com>
Reviewed by Elena Demikhovsky <elena.demikhovsky@intel.com>
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213545
91177308-0d34-0410-b5e6-
96231b3b80d8
Tom Stellard [Mon, 21 Jul 2014 14:28:31 +0000 (14:28 +0000)]
docs: Update relaease documents to include the patch number in the RELEASE tags
This will make it easier to update the release scripts to support
bug-fix releases.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213544
91177308-0d34-0410-b5e6-
96231b3b80d8
Dan Liew [Mon, 21 Jul 2014 14:17:15 +0000 (14:17 +0000)]
Export LLVM_ENABLE_ASSERTIONS in LLVMConfig.cmake so clients know
if the version of LLVM they are trying to use was built with or
without assertions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213532
91177308-0d34-0410-b5e6-
96231b3b80d8
Tom Stellard [Mon, 21 Jul 2014 14:01:14 +0000 (14:01 +0000)]
R600/SI: Store constant initializer data in constant memory
This implements a solution for constant initializers suggested
by Vadim Girlin, where we store the data after the shader code
and then use the S_GETPC instruction to compute its address.
This saves use the trouble of creating a new buffer for constant data
and then having to pass the pointer to the kernel via user SGPRs or the
input buffer.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213530
91177308-0d34-0410-b5e6-
96231b3b80d8
Tom Stellard [Mon, 21 Jul 2014 14:01:12 +0000 (14:01 +0000)]
R600/SI: Add isCFDepth0 Predicate to SALU addc pattern
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213529
91177308-0d34-0410-b5e6-
96231b3b80d8
Tom Stellard [Mon, 21 Jul 2014 14:01:10 +0000 (14:01 +0000)]
R600/SI: Use VALU for i1 XOR
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213528
91177308-0d34-0410-b5e6-
96231b3b80d8
Tom Stellard [Mon, 21 Jul 2014 14:01:08 +0000 (14:01 +0000)]
R600/SI: Use a custom encoding method for simm16 in SOPP branch instructions
This allows us to explicitly define the type of fixup that is needed,
so we can distinguish this from future fixup types.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213527
91177308-0d34-0410-b5e6-
96231b3b80d8
Tom Stellard [Mon, 21 Jul 2014 14:01:05 +0000 (14:01 +0000)]
R600/SI: Rename SOPP operands to match the encoding fields
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213526
91177308-0d34-0410-b5e6-
96231b3b80d8
Daniel Sanders [Mon, 21 Jul 2014 13:30:55 +0000 (13:30 +0000)]
[mips] Add MipsOptionRecord abstraction and use it to implement .reginfo/.MIPS.options
This abstraction allows us to support the various records that can be placed in
the .MIPS.options section in the future. We currently use it to record register
usage information (the ODK_REGINFO record in our ELF64 spec).
Each .MIPS.options record should subclass MipsOptionRecord and provide an
implementation of EmitMipsOptionRecord.
Patch by Matheus Almeida and Toma Tabacu
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213522
91177308-0d34-0410-b5e6-
96231b3b80d8
Tom Stellard [Mon, 21 Jul 2014 13:28:54 +0000 (13:28 +0000)]
TableGen: Allow AddedComplexity values to be negative
This is useful for cases when stand-alone patterns are preferred to the
patterns included in the instruction definitions. Instead of requiring
that stand-alone patterns set a larger AddedComplexity value, which
can be confusing to new developers, the allows us to reduce the
complexity of the included patterns to achieve the same result.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213521
91177308-0d34-0410-b5e6-
96231b3b80d8
Hal Finkel [Mon, 21 Jul 2014 13:15:48 +0000 (13:15 +0000)]
Move the CapturesBefore tracker from AA into CaptureTracking
There were two generally-useful CaptureTracker classes defined in LLVM: the
simple tracker defined in CaptureTracking (and made available via the
PointerMayBeCaptured utility function), and the CapturesBefore tracker
available only inside of AA. This change moves the CapturesBefore tracker into
CaptureTracking, generalizes it slightly (by adding a ReturnCaptures
parameter), and makes it generally available via a PointerMayBeCapturedBefore
utility function.
This logic will be needed, for example, to perform noalias function parameter
attribute inference.
No functionality change intended.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213519
91177308-0d34-0410-b5e6-
96231b3b80d8
Aaron Ballman [Mon, 21 Jul 2014 13:08:08 +0000 (13:08 +0000)]
This declaration has no definition, which is causing MSVC to emit several "no suitable definition provided for explicit template instantiation request" C4661 warnings.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213517
91177308-0d34-0410-b5e6-
96231b3b80d8
Aaron Ballman [Mon, 21 Jul 2014 12:31:43 +0000 (12:31 +0000)]
Fixing an MSVC conversion warning about implicitly converting the shift results to 64-bits. No functional change intended.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213515
91177308-0d34-0410-b5e6-
96231b3b80d8
Hal Finkel [Mon, 21 Jul 2014 12:27:23 +0000 (12:27 +0000)]
Move isIdentifiedFunctionLocal from BasicAA to AA
The ability to identify function locals will exist outside of BasicAA (for
example, logic for inferring noalias function arguments will need this), so
make this concept generally accessible without code duplication.
No functionality change.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213514
91177308-0d34-0410-b5e6-
96231b3b80d8
Daniel Sanders [Mon, 21 Jul 2014 12:25:34 +0000 (12:25 +0000)]
[mips] Try to fix the test/ExecutionEngine tests on a MIPS host.
Fix a dangerous default case that caused MipsCodeEmitter to discard pseudo
instructions it didn't recognize. It will now call llvm_unreachable() for
unrecognized pseudo's and explicitly handles PseudoReturn, PseudoReturn64,
PseudoIndirectBranch, PseudoIndirectBranch64, CFI_INSTRUCTION, IMPLICIT_DEF,
and KILL.
There may be other pseudos that need handling but this was enough for the
ExecutionEngine tests to pass on my test system.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213513
91177308-0d34-0410-b5e6-
96231b3b80d8
Daniel Sanders [Mon, 21 Jul 2014 10:45:47 +0000 (10:45 +0000)]
[mips] Do not emit '.module [no]oddspreg' unless we really need to.
We now emit this directive when we need to contradict the default value (e.g.
-mno-odd-spreg is given) or an option changed the default value (e.g. -mfpxx
is given).
This restores support for the currently available head of binutils. However,
at this point binutils 2.24 is still not sufficient since it does not support
'.module fp=...'.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213511
91177308-0d34-0410-b5e6-
96231b3b80d8
Chandler Carruth [Mon, 21 Jul 2014 09:23:21 +0000 (09:23 +0000)]
FileCheck-ize a test.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213508
91177308-0d34-0410-b5e6-
96231b3b80d8
Tim Northover [Mon, 21 Jul 2014 09:13:56 +0000 (09:13 +0000)]
CodeGen: emit IR-level f16 conversion intrinsics as fptrunc/fpext
This makes the first stage DAG for @llvm.convert.to.fp16 an fptrunc,
and correspondingly @llvm.convert.from.fp16 an fpext. The legalisation
path is now uniform, regardless of the input IR:
fptrunc -> FP_TO_FP16 (if f16 illegal) -> libcall
fpext -> FP16_TO_FP (if f16 illegal) -> libcall
Each target should be able to select the version that best matches its
operations and not be required to duplicate patterns for both fptrunc
and FP_TO_FP16 (for example).
As a result we can remove some redundant AArch64 patterns.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213507
91177308-0d34-0410-b5e6-
96231b3b80d8
Chandler Carruth [Mon, 21 Jul 2014 08:56:44 +0000 (08:56 +0000)]
[SDAG,cleanup] Switch the DAG combiner over to use the spelling
'Worklist' consistently rather than a deeply confusing mixture of
'WorkList' and 'Worklist'.
Notably, the very 'WorkList' of the DAG combiner was exposed to target
specific DAG combines under an interface 'AddToWorklist' which was
implemented by in turn calling 'AddToWorkList' in the combiner. This has
sent me circling with the wrong case in grep one too many times.
I chose to normalize on 'Worklist' because that one won the grep-vote
for llvm/lib/... by a hundered hits or so, and it is used in places
relatively "canonical" such as InstCombine's Worklist. Let's all jsut
pick this casing, whether "correct", "good", or "bad" and be
consistent...
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213506
91177308-0d34-0410-b5e6-
96231b3b80d8
Chandler Carruth [Mon, 21 Jul 2014 08:32:31 +0000 (08:32 +0000)]
[SDAG] Rather than using a narrow test against the one dummy node on the
stack, filter all handle nodes from the DAG combiner worklist.
This will also handle cases where other handle nodes might be
(erroneously) added to the worklist and then cause bugs and explosions
when deleted. For example, when running the legalizer within the DAG
combiner, there are times when other handle nodes are used and can end
up here.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213505
91177308-0d34-0410-b5e6-
96231b3b80d8
Andrea Di Biagio [Mon, 21 Jul 2014 07:30:54 +0000 (07:30 +0000)]
[DAGCombiner] Improve the shuffle-vector folding logic.
Canonicalize shuffles according to rules:
* shuffle(A, shuffle(A, B)) -> shuffle(shuffle(A,B), A)
* shuffle(B, shuffle(A, B)) -> shuffle(shuffle(A,B), B)
* shuffle(B, shuffle(A, Undef)) -> shuffle(shuffle(A, Undef), B)
This patch helps identifying more shuffle pairs that could be combined reusing
the already existing rules in the DAGCombiner.
Added new test 'combine-vec-shuffle-5.ll' to verify that the canonicalized
shuffles are now folded into a single shuffle node by the DAGCombiner.
Added more test cases to 'combine-vec-shuffle-4.ll'.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213504
91177308-0d34-0410-b5e6-
96231b3b80d8
Andrea Di Biagio [Mon, 21 Jul 2014 07:28:51 +0000 (07:28 +0000)]
[DAG] Refactor some logic. No functional change.
This patch removes function 'CommuteVectorShuffle' from X86ISelLowering.cpp
and moves its logic into SelectionDAG.cpp as method 'getCommutedVectorShuffles'.
This refactoring is in preperation of an upcoming change to the DAGCombiner.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213503
91177308-0d34-0410-b5e6-
96231b3b80d8
Gerolf Hoflehner [Mon, 21 Jul 2014 03:02:46 +0000 (03:02 +0000)]
Fix for regression: [Bug 20369] wrong code at -O3 on x86_64-linux-gnu in 64-bit mode
Prevents hoisting of loads above stores and sinking of stores below loads
in MergedLoadStoreMotion.cpp (rdar://
15991737)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213497
91177308-0d34-0410-b5e6-
96231b3b80d8
Ulrich Weigand [Mon, 21 Jul 2014 00:13:26 +0000 (00:13 +0000)]
[PowerPC] ELFv2 aggregate passing support
This patch adds infrastructure support for passing array types
directly. These can be used by the front-end to pass aggregate
types (coerced to an appropriate array type). The details of the
array type being used inform the back-end about ABI-relevant
properties. Specifically, the array element type encodes:
- whether the parameter should be passed in FPRs, VRs, or just
GPRs/stack slots (for float / vector / integer element types,
respectively)
- what the alignment requirements of the parameter are when passed in
GPRs/stack slots (8 for float / 16 for vector / the element type
size for integer element types) -- this corresponds to the
"byval align" field
Using the infrastructure provided by this patch, a companion patch
to clang will enable two features:
- In the ELFv2 ABI, pass (and return) "homogeneous" floating-point
or vector aggregates in FPRs and VRs (this is similar to the ARM
homogeneous aggregate ABI)
- As an optimization for both ELFv1 and ELFv2 ABIs, pass aggregates
that fit fully in registers without using the "byval" mechanism
The patch uses the functionArgumentNeedsConsecutiveRegisters callback
to encode that special treatment is required for all directly-passed
array types. The isInConsecutiveRegs / isInConsecutiveRegsLast bits set
as a results are then used to implement the required size and alignment
rules in CalculateStackSlotSize / CalculateStackSlotAlignment etc.
As a related change, the ABI routines have to be modified to support
passing floating-point types in GPRs. This is necessary because with
homogeneous aggregates of 4-byte float type we can now run out of FPRs
*before* we run out of the 64-byte argument save area that is shadowed
by GPRs. Any extra floating-point arguments that no longer fit in FPRs
must now be passed in GPRs until we run out of those too.
Note that there was already code to pass floating-point arguments in
GPRs used with vararg parameters, which was done by writing the argument
out to the argument save area first and then reloading into GPRs. The
patch re-implements this, however, in favor of code packing float arguments
directly via extension/truncation, BITCAST, and BUILD_PAIR operations.
This is required to support the ELFv2 ABI, since we cannot unconditionally
write to the argument save area (which the caller might not have allocated).
The change does, however, affect ELFv1 varags routines too; but even here
the overall effect should be advantageous: Instead of loading the argument
into the FPR, then storing the argument to the stack slot, and finally
reloading the argument from the stack slot into a GPR, the new code now
just loads the argument into the FPR, and subsequently loads the argument
into the GPR (via BITCAST). That BITCAST might imply a save/reload from
a stack temporary (in which case we're no worse than before); but it
might be implemented more efficiently in some cases.
The final part of the patch enables up to 8 FPRs and VRs for argument
return in PPCCallingConv.td; this is required to support returning
ELFv2 homogeneous aggregates. (Note that this doesn't affect other ABIs
since LLVM wil only look for which register to use if the parameter is
marked as "direct" return anyway.)
Reviewed by Hal Finkel.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213493
91177308-0d34-0410-b5e6-
96231b3b80d8
Ulrich Weigand [Mon, 21 Jul 2014 00:03:18 +0000 (00:03 +0000)]
[PowerPC] ELFv2 explicit CFI for CR fields
This is a minor improvement in the ELFv2 ABI. In ELFv1, DWARF CFI
would represent a saved CR word (holding CR fields CR2, CR3, and CR4)
using just a single CFI record refering to CR2. In ELFv2 instead,
each of the CR fields is represented by its own CFI record. The
advantage is that the compiler can now chose to save just a single
(or two) CR fields instead of all of them, if those are the only ones
that actually need saving. That can lead to more efficient code using
mf(o)crf instead of the (slow) mfcr instruction.
Note that this patch does not (yet) implement this more efficient
code generation, but it does implement the part that is required to
be ABI compliant: creating multiple CFI records if multiple CR fields
are saved.
Reviewed by Hal Finkel.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213492
91177308-0d34-0410-b5e6-
96231b3b80d8
Ulrich Weigand [Sun, 20 Jul 2014 23:53:14 +0000 (23:53 +0000)]
[PowerPC] ELFv2 dynamic loader support
This patch enables the new ELFv2 ABI in the runtime dynamic loader.
The loader has to implement the following features:
- In the ELFv2 ABI, do not look up a function descriptor in .opd, but
instead use the local entry point when resolving a direct call.
- Update the TOC restore code to use the new TOC slot linkage area
offset.
- Create PLT stubs appropriate for the ELFv2 ABI.
Note that this patch also adds common-code changes. These are necessary
because the loader must check the newly added ELF flags: the e_flags
header bits encoding the ABI version, and the st_other symbol table
entry bits encoding the local entry point offset. There is currently
no way to access these, so I've added ObjectFile::getPlatformFlags and
SymbolRef::getOther accessors.
Reviewed by Hal Finkel.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213491
91177308-0d34-0410-b5e6-
96231b3b80d8
Ulrich Weigand [Sun, 20 Jul 2014 23:43:15 +0000 (23:43 +0000)]
[PowerPC] ELFv2 stack space reduction
The ELFv2 ABI reduces the amount of stack required to implement an
ABI-compliant function call in two ways:
* the "linkage area" is reduced from 48 bytes to 32 bytes by
eliminating two unused doublewords
* the 64-byte "parameter save area" is now optional and need not be
present in certain cases (it remains mandatory in functions with
variable arguments, and functions that have any parameter that is
passed on the stack)
The following patch implements this required changes:
- reducing the linkage area, and associated relocation of the TOC save
slot, in getLinkageSize / getTOCSaveOffset (this requires updating all
callers of these routines to pass in the isELFv2ABI flag).
- (partially) handling the case where the parameter save are is optional
This latter part requires some extra explanation: Currently, we still
always allocate the parameter save area when *calling* a function.
That is certainly always compliant with the ABI, but may cause code to
allocate stack unnecessarily. This can be addressed by a follow-on
optimization patch.
On the *callee* side, in LowerFormalArguments, we *must* track
correctly whether the ABI guarantees that the caller has allocated
the parameter save area for our use, and the patch does so. However,
there is one complication: the code that handles incoming "byval"
arguments will currently *always* write to the parameter save area,
because it has to force incoming register arguments to the stack since
it must return an *address* to implement the byval semantics.
To fix this, the patch changes the LowerFormalArguments code to write
arguments to a freshly allocated stack slot on the function's own stack
frame instead of the argument save area in those cases where that area
is not present.
Reviewed by Hal Finkel.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213490
91177308-0d34-0410-b5e6-
96231b3b80d8
Ulrich Weigand [Sun, 20 Jul 2014 23:31:44 +0000 (23:31 +0000)]
[PowerPC] ELFv2 function call changes
This patch builds upon the two preceding MC changes to implement the
basic ELFv2 function call convention. In the ELFv1 ABI, a "function
descriptor" was associated with every function, pointing to both the
entry address and the related TOC base (and a static chain pointer
for nested functions). Function pointers would actually refer to that
descriptor, and the indirect call sequence needed to load up both entry
address and TOC base.
In the ELFv2 ABI, there are no more function descriptors, and function
pointers simply refer to the (global) entry point of the function code.
Indirect function calls simply branch to that address, after loading it
up into r12 (as required by the ABI rules for a global entry point).
Direct function calls continue to just do a "bl" to the target symbol;
this will be resolved by the linker to the local entry point of the
target function if it is local, and to a PLT stub if it is global.
That PLT stub would then load the (global) entry point address of the
final target into r12 and branch to it. Note that when performing a
local function call, r2 must be set up to point to the current TOC
base: if the target ends up local, the ABI requires that its local
entry point is called with r2 set up; if the target ends up global,
the PLT stub requires that r2 is set up.
This patch implements all LLVM changes to implement that scheme:
- No longer create a function descriptor when emitting a function
definition (in EmitFunctionEntryLabel)
- Emit two entry points *if* the function needs the TOC base (r2)
anywhere (this is done EmitFunctionBodyStart; note that this cannot
be done in EmitFunctionBodyStart because the global entry point
prologue code must be *part* of the function as covered by debug info).
- In order to make use tracking of r2 (as needed above) work correctly,
mark direct function calls as implicitly using r2.
- Implement the ELFv2 indirect function call sequence (no function
descriptors; load target address into r12).
- When creating an ELFv2 object file, emit the .abiversion 2 directive
to tell the linker to create the appropriate version of PLT stubs.
Reviewed by Hal Finkel.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213489
91177308-0d34-0410-b5e6-
96231b3b80d8
Hal Finkel [Sun, 20 Jul 2014 23:28:25 +0000 (23:28 +0000)]
[LoopVectorize] Remove an unused private AA pointer
Thanks to the lld-x86_64-darwin13 builder for catching this first.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213488
91177308-0d34-0410-b5e6-
96231b3b80d8
Ulrich Weigand [Sun, 20 Jul 2014 23:15:06 +0000 (23:15 +0000)]
[MC] Pass MCSymbolData to needsRelocateWithSymbol
As discussed in a previous checking to support the .localentry
directive on PowerPC, we need to inspect the actual target symbol
in needsRelocateWithSymbol to make the appropriate decision based
on that symbol's st_other bits.
Currently, needsRelocateWithSymbol does not get the target symbol.
However, it is directly available to its sole caller. This patch
therefore simply extends the needsRelocateWithSymbol by a new
parameter "const MCSymbolData &SD", passes in the target symbol,
and updates all derived implementations.
In particular, in the PowerPC implementation, this patch removes
the FIXME added by the previous checkin.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213487
91177308-0d34-0410-b5e6-
96231b3b80d8
Hal Finkel [Sun, 20 Jul 2014 23:07:52 +0000 (23:07 +0000)]
[LoopVectorize] Use AA to partition potential dependency checks
Prior to this change, the loop vectorizer did not make use of the alias
analysis infrastructure. Instead, it performed memory dependence analysis using
ScalarEvolution-based linear dependence checks within equivalence classes
derived from the results of ValueTracking's GetUnderlyingObjects.
Unfortunately, this meant that:
1. The loop vectorizer had logic that essentially duplicated that in BasicAA
for aliasing based on identified objects.
2. The loop vectorizer could not partition the space of dependency checks
based on information only easily available from within AA (TBAA metadata is
currently the prime example).
This means, for example, regardless of whether -fno-strict-aliasing was
provided, the vectorizer would only vectorize this loop with a runtime
memory-overlap check:
void foo(int *a, float *b) {
for (int i = 0; i < 1600; ++i)
a[i] = b[i];
}
This is suboptimal because the TBAA metadata already provides the information
necessary to show that this check unnecessary. Of course, the vectorizer has a
limit on the number of such checks it will insert, so in practice, ignoring
TBAA means not vectorizing more-complicated loops that we should.
This change causes the vectorizer to use an AliasSetTracker to keep track of
the pointers in the loop. The resulting alias sets are then used to partition
the space of dependency checks, and potential runtime checks; this results in
more-efficient vectorizations.
When pointer locations are added to the AliasSetTracker, two things are done:
1. The location size is set to UnknownSize (otherwise you'd not catch
inter-iteration dependencies)
2. For instructions in blocks that would need to be predicated, TBAA is
removed (because the metadata might have a control dependency on the condition
being speculated).
For non-predicated blocks, you can leave the TBAA metadata. This is safe
because you can't have an iteration dependency on the TBAA metadata (if you
did, and you unrolled sufficiently, you'd end up with the same pointer value
used by two accesses that TBAA says should not alias, and that would yield
undefined behavior).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213486
91177308-0d34-0410-b5e6-
96231b3b80d8
Ulrich Weigand [Sun, 20 Jul 2014 23:06:03 +0000 (23:06 +0000)]
[PowerPC] ELFv2 MC support for .localentry directive
A second binutils feature needed to support ELFv2 is the .localentry
directive. In the ELFv2 ABI, functions may have two entry points:
one for calling the routine locally via "bl", and one for calling the
function via function pointer (either at the source level, or implicitly
via a PLT stub for global calls). The two entry points share a single
ELF symbol, where the ELF symbol address identifies the global entry
point address, while the local entry point is found by adding a delta
offset to the symbol address. That offset is encoded into three
platform-specific bits of the ELF symbol st_other field.
The .localentry directive instructs the assembler to set those fields
to encode a particular offset. This is typically used by a function
prologue sequence like this:
func:
addis r2, r12, (.TOC.-func)@ha
addi r2, r2, (.TOC.-func)@l
.localentry func, .-func
Note that according to the ABI, when calling the global entry point,
r12 must be set to point the global entry point address itself; while
when calling the local entry point, r2 must be set to point to the TOC
base. The two instructions between the global and local entry point in
the above example translate the first requirement into the second.
This patch implements support in the PowerPC MC streamers to emit the
.localentry directive (both into assembler and ELF object output), as
well as support in the assembler parser to parse that directive.
In addition, there is another change required in MC fixup/relocation
handling to properly deal with relocations targeting function symbols
with two entry points: When the target function is known local, the MC
layer would immediately handle the fixup by inserting the target
address -- this is wrong, since the call may need to go to the local
entry point instead. The GNU assembler handles this case by *not*
directly resolving fixups targeting functions with two entry points,
but always emits the relocation and relies on the linker to handle
this case correctly. This patch changes LLVM MC to do the same (this
is done via the processFixupValue routine).
Similarly, there are cases where the assembler would normally emit a
relocation, but "simplify" it to a relocation targeting a *section*
instead of the actual symbol. For the same reason as above, this
may be wrong when the target symbol has two entry points. The GNU
assembler again handles this case by not performing this simplification
in that case, but leaving the relocation targeting the full symbol,
which is then resolved by the linker. This patch changes LLVM MC
to do the same (via the needsRelocateWithSymbol routine).
NOTE: The method used in this patch is overly pessimistic, since the
needsRelocateWithSymbol routine currently does not have access to the
actual target symbol, and thus must always assume that it might have
two entry points. This will be improved upon by a follow-on patch
that modifies common code to pass the target symbol when calling
needsRelocateWithSymbol.
Reviewed by Hal Finkel.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213485
91177308-0d34-0410-b5e6-
96231b3b80d8
Ulrich Weigand [Sun, 20 Jul 2014 22:56:57 +0000 (22:56 +0000)]
[PowerPC] ELFv2 MC support for .abiversion directive
ELFv2 binaries are marked by a bit in the ELF header e_flags field.
A new assembler directive .abiversion can be used to set that flag.
This patch implements support in the PowerPC MC streamers to emit the
.abiversion directive (both into assembler and ELF binary output),
as well as support in the assembler parser to parse the .abiversion
directive.
Reviewed by Hal Finkel.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213484
91177308-0d34-0410-b5e6-
96231b3b80d8
Ulrich Weigand [Sun, 20 Jul 2014 22:36:52 +0000 (22:36 +0000)]
[PowerPC] Refactor byval handling in LowerFormalArguments_64SVR4
When handling an incoming byval argument, we need to possibly write
incoming registers to the stack in order to create an on-stack image
of the parameter, so we can return its address to common code.
This currently uses CreateFixedObject to access the parts of the
parameter save area where the argument is (or needs to be) stored.
However, sometimes we need to access multiple parts of that area,
e.g. to write multiple registers. The code currently uses a new
CreateFixedObject call for each of these accesses, resulting in
a patchwork of overlapping (fixed) stack objects.
This doesn't really matter in the case of fixed objects, since
any access to those turns into a fixed stackpointer + offset
address anyway. However, with the upcoming ELFv2 patches, we
may actually need to place an incoming argument into our *own*
stack frame instead of the caller's. This means we need to use
CreateStackObject instead, and we cannot have multiple overlapping
instances of those.
To make the rest of the argument handling code work equally in
both situations, this patch refactors it to always use just a
single call to CreateFixedObject, and access parts of that object
as required using address arithmetic. This way, we can in a future
patch substitute CreateStackObject without further changes.
No change to generated code intended.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213483
91177308-0d34-0410-b5e6-
96231b3b80d8
Ulrich Weigand [Sun, 20 Jul 2014 22:26:40 +0000 (22:26 +0000)]
[PowerPC] Fix FrameIndex handling in SelectAddressRegImm
The PPCTargetLowering::SelectAddressRegImm routine needs to handle
FrameIndex nodes in a special manner, by tranlating them into a
TargetFrameIndex node. This was done in most cases, but seems to
have been neglected in one path: when the input tree has an OR of
the FrameIndex with an immediate. This can happen if the FrameIndex
can be proven to be sufficiently aligned that an OR of that immediate
is equivalent to an ADD.
The missing handling of FrameIndex in that case caused the SelectionDAG
instruction selection to miss opportunities to merge the OR back into
the FrameIndex node, leading to superfluous addi/ori instructions in
the final assembler output.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213482
91177308-0d34-0410-b5e6-
96231b3b80d8
Artyom Skrobov [Sun, 20 Jul 2014 12:08:28 +0000 (12:08 +0000)]
Namespace cleanup (no functional change)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213478
91177308-0d34-0410-b5e6-
96231b3b80d8
NAKAMURA Takumi [Sun, 20 Jul 2014 11:15:07 +0000 (11:15 +0000)]
SIISelLowering.cpp: Define _USE_MATH_DEFINES to let M_PI provided on MS <cmath>.
FIXME: Would it be better to move it into configure?
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213477
91177308-0d34-0410-b5e6-
96231b3b80d8