Commit Graph

365 Commits

Author SHA1 Message Date
Dan Gohman
a05c5de67c [WebAssembly] Add another possible code-size optimization to README.txt
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@262740 91177308-0d34-0410-b5e6-96231b3b80d8
2016-03-04 20:09:57 +00:00
JF Bastien
df4c0fa9a0 WebAssembly: fix build
More API churn, experimental target got sad.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@262179 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-28 15:33:53 +00:00
JF Bastien
cb7b2cb2b3 WebAssembly: fix build
It was broken by the work for PR26753.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@262140 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-27 16:38:23 +00:00
Derek Schuff
e5a3819fc8 Revert "[WebAssembly] Stackify code emitted by eliminateFrameIndex"
This reverts r261685 due to wasm test breakage.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261702 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-23 22:13:21 +00:00
Derek Schuff
64f8810499 [WebAssembly] Stackify code emitted by eliminateFrameIndex
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261685 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-23 21:25:17 +00:00
Derek Schuff
c15325e5a1 [WebAssembly] Add TODO comment to revisit red zone size
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261664 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-23 18:17:46 +00:00
Derek Schuff
8ff73c1307 [WebAssembly] Implement red zone for user stack
Implements a mostly-conventional redzone for the userspace
stack. Because we have unsigned load/store offsets we continue to use a
local SP subtracted from the incoming SP but do not write it back to
memory.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261662 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-23 18:13:07 +00:00
Derek Schuff
718d992d1f [WebAssembly] Fix writeback of stack pointer with dynamic alloca
Previously the stack pointer was only written back to memory in the
prolog. But this is wrong for dynamic allocas, for which
target-independent codegen handles SP updates after the prolog (and
possibly even in another BB). Instead update the SP global in
ADJCALLSTACKDOWN which is generated after the SP update sequence.
This will have further refinements when we add red zone support.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261579 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-22 21:57:17 +00:00
Dan Gohman
e1553a649a [WebAssembly] Re-enable the TailDuplicate pass.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261566 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-22 20:47:12 +00:00
JF Bastien
4a8755bfe6 WebAssembly: update expected failures
clang r261557 lowers va_arg in clang.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261564 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-22 20:37:34 +00:00
Dan Gohman
1b10833563 [WebAssembly] Teach address folding to fold bitwise-or nodes.
LLVM converts adds into ors when it can prove that the operands don't share
any non-zero bits. Teach address folding to recognize or instructions with
constant operands with this property that can be folded into addresses as
if they were adds.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261562 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-22 20:04:02 +00:00
Dan Gohman
125ad6e3d9 [WebAssembly] Properly ignore llvm.dbg.value instructions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261538 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-22 17:45:20 +00:00
JF Bastien
31fee5e7e4 WebAssembly: update expected torture test failures
r261457 handles CopyToReg nodes with flag results in LowerCopyToReg, which was causing the SelectionDAGNodes assert.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261479 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-21 16:52:00 +00:00
Dan Gohman
a96dc7d5ad [WebAssembly] Support physical registers in the rewrite-to-discard optimization.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261465 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-21 03:27:22 +00:00
Dan Gohman
98f8ef3a28 [WebAssembly] Refine a README.txt entry.
The register coloring pass may also need to be involved in order to
optimally sort registers.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261458 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-20 23:11:14 +00:00
Dan Gohman
772074148f [WebAssembly] Handle CopyToReg nodes with flag results in LowerCopyToReg.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261457 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-20 23:09:44 +00:00
Derek Schuff
545c0902d4 [WebAssembly] Write stack pointer back to memory when FP is used
The stack pointer is bumped when there is a frame pointer or when there
are static-size objects, but was only getting written back when there
were static-size objects.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261453 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-20 22:18:47 +00:00
Derek Schuff
37d3f7f35c [WebAssembly] Stackify function prologs and epilogs
The instructions are the same, but fewer locals are used.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261452 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-20 21:46:50 +00:00
Dan Gohman
1b96a6c875 [WebAssembly] Add another optimization idea to README.txt.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261354 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-19 19:22:44 +00:00
Dan Gohman
07e5326d7d [WebAssembly] Don't use setRequiresStructuredCFG(true).
While we still do want reducible control flow, the RequiresStructuredCFG
flag imposes more strict structure constraints than WebAssembly wants.
Unsetting this flag enables critical edge splitting and tail merging.

Also, disable TailDuplication explicitly, as it doesn't support virtual
registers, and was previously only disabled by the RequiresStructuredCFG
flag.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261190 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-18 06:32:53 +00:00
Derek Schuff
8c6d367a4e [WebAssembly] Disable register stackification and coloring when not optimizing
These passes are optimizations, and should be disabled when not
optimizing.
Also create an MCCodeGenInfo so the opt level is correctly plumbed to
the backend pass manager.
Also remove the command line flag for disabling register coloring;
running llc with -O0 should now be useful for debugging, so it's not
necessary.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261176 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-17 23:20:43 +00:00
JF Bastien
eeab9a44a1 WebAssembly: update expected failures
r261050 seems to inadvertently fix the assertion failure.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261051 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-17 01:59:23 +00:00
Dan Gohman
1a8392e483 [WebAssembly] Call memcpy for large byval copies.
This fixes very slow compilation on
test/CodeGen/Generic/2010-11-04-BigByval.ll . Note that MaxStoresPerMemcpy
and friends are not yet carefully tuned so the cutoff point is currently
somewhat arbitrary. However, it's important that there be a cutoff point
so that we don't emit unbounded quantities of loads and stores.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261050 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-17 01:43:37 +00:00
JF Bastien
39e0580624 WebAssembly: update expected test failures
r261032 adds frame address support.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261044 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-17 00:34:15 +00:00
Dan Gohman
884b0026bf [WebAssembly] Use SDValue::getConstantOperandVal. NFC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261037 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-17 00:14:03 +00:00
Dan Gohman
f3e241c3c2 [WebAssembly] Implement __builtin_frame_address.
Differential Revision: http://reviews.llvm.org/D17307


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261032 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-16 23:48:04 +00:00
Derek Schuff
c523ec4855 [WebAssembly] Update torture test expectations
These were fixed with r260978

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261017 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-16 21:52:06 +00:00
Derek Schuff
7ea47333dc [WebAssemly] Don't move calls or stores past intervening loads
The register stackifier currently checks for intervening stores (and
loads that may alias them) but doesn't account for the fact that the
instruction being moved may affect intervening loads.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261014 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-16 21:44:19 +00:00
Derek Schuff
cd66f7a1e9 [WebAssembly] Insert COPY_LOCAL between CopyToReg and FrameIndex DAG nodes
CopyToReg nodes don't support FrameIndex operands. Other targets select
the FI to some LEA-like instruction, but since we don't have that, we
need to insert some kind of instruction that can take an FI operand and
produces a value usable by CopyToReg (i.e. in a vreg). So insert a dummy
copy_local between Op and its FI operand. This results in a redundant
copy which we should optimize away later (maybe in the post-FI-lowering
peephole pass).

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260987 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-16 18:18:36 +00:00
Dan Gohman
2ed76660d2 [WebAssembly] Switch from RPO sorting to topological sorting.
WebAssembly doesn't require full RPO; topological sorting is sufficient and
can preserve more of the MachineBlockPlacement ordering. Unfortunately, this
still depends a lot on heuristics, because while we use the
MachineBlockPlacement ordering as a guide, we can't use it in places where
it isn't topologically ordered. This area will require further attention.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260978 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-16 16:22:41 +00:00
Dan Gohman
0f54412dec [WebAssembly] Create new registers instead of reusing old ones in RegStackify.
This avoids some complications updating LiveIntervals to be aware of the new
register lifetimes, because we can just compute new intervals from scratch
rather than describe how the old ones have been changed.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260971 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-16 15:17:21 +00:00
Dan Gohman
ab40f7f14f [WebAssembly] Implement support for custom NaN bit patterns.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260968 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-16 15:14:23 +00:00
Derek Schuff
ba4e9d05f5 [WebAssembly] Report more meaningful error messages for some unsupported
ops.

Computed gotos and RETURNADDR may never be supported; we can do
FRAMEADDR in the future.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260759 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-12 22:56:03 +00:00
Derek Schuff
0d7bc82046 [WebAssembly] Update test expectations after r260737
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260750 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-12 22:05:08 +00:00
Dan Gohman
f97f532728 [WebAssembly] Fix byval for empty types.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260740 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-12 21:30:18 +00:00
Dan Gohman
73cd89a6f2 [WebAssembly] Fix insertion of a BLOCK in a loop header that also ends a BLOCK.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260737 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-12 21:19:25 +00:00
Derek Schuff
f0d31106f3 [WebAssembly] Reformat WebAssemblyFrameLowering and WebAssemblyISelLowering
Reviewers: sunfish, jfb

Subscribers: jfb, dschuff

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260585 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-11 20:57:09 +00:00
Derek Schuff
b73ab6b083 [WebAssembly] Re-triage list of compilation failures for torture tests
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260438 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-10 21:43:16 +00:00
Derek Schuff
ded8212063 [WebAssembly] Address comments left over from r260421
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260429 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-10 20:14:15 +00:00
Derek Schuff
d239e9c2e5 [WebAssembly] Switch varags calling convention to use a register
Instead of passing varargs directly on the user stack, allocate a buffer in
the caller's stack frame and pass a pointer to it. This simplifies the C
ABI (e.g. non-C callers of C functions do not need to use C's user stack if
they have their own mechanism) and allows further optimizations in the future
(e.g. fewer functions may need to use the stack).

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260421 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-10 19:51:04 +00:00
Dan Gohman
cdcce2d758 [WebAssembly] Update the br_if instructions' operand orders to match the spec.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260152 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-08 21:50:13 +00:00
Dan Gohman
f80c9dda08 [WebAssembly] Add another optimization idea to README.txt.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260070 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-08 03:42:36 +00:00
Dan Gohman
379844452a [WebAssembly] Update the select instructions' operand orders to match the spec.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259893 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-05 17:14:59 +00:00
JF Bastien
38cce322fb WebAssembly: update expected GCC torture test failures
The 3 programs used __attribute__((mode(?))) on enum, which clang r259497 fixed.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259508 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-02 14:27:34 +00:00
Oliver Stannard
9ed9eb72f4 Refactor backend diagnostics for unsupported features
Re-commit of r258951 after fixing layering violation.

The BPF and WebAssembly backends had identical code for emitting errors
for unsupported features, and AMDGPU had very similar code. This merges
them all into one DiagnosticInfo subclass, that can be used by any
backend.

There should be minimal functional changes here, but some AMDGPU tests
have been updated for the new format of errors (it used a slightly
different format to BPF and WebAssembly). The AMDGPU error messages will
now benefit from having precise source locations when debug info is
available.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259498 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-02 13:52:43 +00:00
JF Bastien
7f5fe827a0 WebAssembly: add option to disable register coloring
Having this hidden option makes it easier to debug other issues.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259482 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-02 09:30:01 +00:00
JF Bastien
fff4c9ce47 WebAssembly NFC: simplify control flow
This should now be easier to read.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259349 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-01 10:46:16 +00:00
JF Bastien
43b517fe4e WebAssembly: more failures are gone
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259321 91177308-0d34-0410-b5e6-96231b3b80d8
2016-01-31 08:19:40 +00:00
JF Bastien
632c5868b4 WebAssembly: update expected failures
r259305 fixed a few assertions around FrameIndex, and I forgot to update these failures despite having run the torture tests.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259320 91177308-0d34-0410-b5e6-96231b3b80d8
2016-01-31 08:05:05 +00:00
Derek Schuff
a2b61fb428 [WebAssembly] Fix uses of FrameIndex as store values
Previously the code assumed all uses of FI on loads and stores were as
addresses. This checks whether the use is the address or a value and
handles the latter case as it does for non-memory instructions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259306 91177308-0d34-0410-b5e6-96231b3b80d8
2016-01-30 21:43:08 +00:00