15851 Commits

Author SHA1 Message Date
Gor Nishanov
303ae673f8 CoroSplit: Squash unused variable FnTrigger warning in NDEBUG
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277938 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-06 21:11:10 +00:00
Gor Nishanov
2007f371f4 [Coroutines] Part 5: Add CGSCC restart trigger
Summary:
CoroSplit pass processes the coroutine twice. First, it lets it go through
complete IPO optimization pipeline as a single function. It forces restart
of the pipeline by inserting an indirect call to an empty function "coro.devirt.trigger"
which is devirtualized by CoroElide pass that triggers a restart of the pipeline by CGPassManager.
(In later patches, when CoroSplit pass sees the same coroutine the second time, it splits it up,
adds coroutine subfunctions to the SCC to be processed by IPO pipeline.)

Documentation and overview is here: http://llvm.org/docs/Coroutines.html.

Upstreaming sequence (rough plan)
1.Add documentation. (https://reviews.llvm.org/D22603)
2.Add coroutine intrinsics. (https://reviews.llvm.org/D22659)
3.Add empty coroutine passes. (https://reviews.llvm.org/D22847)
4.Add coroutine devirtualization + tests.
ab) Lower coro.resume and coro.destroy (https://reviews.llvm.org/D22998)
c) Do devirtualization (https://reviews.llvm.org/D23229)
5.Add CGSCC restart trigger + tests. <= we are here
6.Add coroutine heap elision + tests.
7.Add the rest of the logic (split into more patches)

Reviewers: mehdi_amini, majnemer

Subscribers: llvm-commits, mehdi_amini

Differential Revision: https://reviews.llvm.org/D23234

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277936 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-06 20:44:39 +00:00
Benjamin Kramer
a44f29cdc4 [Inliner] Use function_ref for functors which are never taken ownership of.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277922 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-06 12:33:46 +00:00
Benjamin Kramer
fb0b339283 [LoadCombine] Simplify code with a brace init. NFC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277921 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-06 12:11:11 +00:00
Benjamin Kramer
284030ab2c Move helpers into anonymous namespaces. NFC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277916 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-06 11:13:10 +00:00
Sanjoy Das
9da24c7e7f [InstCombine] Don't coerce non-integral pointers to integers
Reviewers: majnemer

Subscribers: mcrosier, llvm-commits

Differential Revision: https://reviews.llvm.org/D23231

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277910 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-06 02:58:48 +00:00
Matthias Braun
3f4f33680b Revert "(refs/bisect/bad) GVN-hoist: enable by default"
GVN-Hoist appears to miscompile llvm-testsuite
SingleSource/Benchmarks/Misc/fbench.c at the moment.

I filed http://llvm.org/PR28880

This reverts commit r277786.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277909 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-06 02:23:15 +00:00
Gor Nishanov
fa2883261f Part 4c: Coroutine Devirtualization: Devirtualize coro.resume and coro.destroy.
Summary:
This is the 4c patch of the coroutine series. CoroElide pass now checks if PostSplit coro.begin
is referenced by coro.subfn.addr intrinsics. If so replace coro.subfn.addrs with an appropriate coroutine
subfunction associated with that coro.begin.

Documentation and overview is here: http://llvm.org/docs/Coroutines.html.

Upstreaming sequence (rough plan)
1.Add documentation. (https://reviews.llvm.org/D22603)
2.Add coroutine intrinsics. (https://reviews.llvm.org/D22659)
3.Add empty coroutine passes. (https://reviews.llvm.org/D22847)
4.Add coroutine devirtualization + tests.
ab) Lower coro.resume and coro.destroy (https://reviews.llvm.org/D22998)
c) Do devirtualization <= we are here
5.Add CGSCC restart trigger + tests.
6.Add coroutine heap elision + tests.
7.Add the rest of the logic (split into more patches)

Reviewers: majnemer

Subscribers: mehdi_amini, llvm-commits

Differential Revision: https://reviews.llvm.org/D23229

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277908 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-06 02:16:35 +00:00
Michael Zolotukhin
392ab3662c Revert "[LoopSimplify] Fix updating LCSSA after separating nested loops."
This reverts commit r277877.
Try to appease clang-x64-ninja-win7 buildbot.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277901 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-06 01:48:51 +00:00
Sanjoy Das
9c8288602e [IRCE] Remove unused headers; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277892 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-06 00:02:01 +00:00
Sanjoy Das
265e61ad49 [IRCE] Preserve loop-simplify form
Fixes PR28764.  Right now there is no way to test this, but (as
mentioned on the PR) with Michael Zolotukhin's yet to be checked in
LoopSimplify verfier, 8 of the llvm-lit tests for IRCE crash.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277891 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-06 00:01:56 +00:00
Sanjay Patel
4b55580c72 [InstCombine] refactor ctlz/cttz folds (NFCI)
Note that this fold really belongs in InstSimplify.
Refactoring here anyway as an intermediate step because
there's a planned addition to this function in D23134.

Differential Revision: https://reviews.llvm.org/D23223



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277883 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-05 22:42:46 +00:00
Daniel Berlin
466b4f2148 [MSSA] Use depth first iterator instead of custom version.
Summary:
Originally the plan was to use the custom worklist to do some block popping,
and because we don't actually need a visited set. The custom one we have
here is slightly broken, and it's not worth fixing vs using depth_first_iterator since we aren't going to go the route we originally
were.

Fixes PR28874
Reviewers: george.burgess.iv

Subscribers: llvm-commits, gberry

Differential Revision: https://reviews.llvm.org/D23187

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277880 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-05 22:09:14 +00:00
Michael Zolotukhin
41d635e247 [LoopSimplify] Fix updating LCSSA after separating nested loops.
This fixes PR28825. The problem was that we only checked if a value from
a created inner loop is used in the outer loop, and fixed LCSSA for
them. But we missed to fixup LCSSA for values used in exits of the outer
loop.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277877 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-05 21:52:58 +00:00
Daniel Berlin
b081e9c1df [MSSA] Match assert vs llvm_unreachable style in verification functions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277873 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-05 21:47:20 +00:00
Daniel Berlin
f5e11c4209 Rewrite domination verifier to handle local domination as well.
Summary:
Rewrite domination verifier to handle local domination as well.
This catches a bug Geoff Berry noticed.

Reviewers: george.burgess.iv

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D23184

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277872 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-05 21:46:52 +00:00
Davide Italiano
927cc57fc9 [FlattenCFG] Simplify + remove unused variable. NFCI.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277864 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-05 20:53:35 +00:00
Ivan Krasin
51ae50fd08 WholeProgramDevirt: print remarks with devirtualized method names.
Summary:
Chrome on Linux uses WholeProgramDevirt for speed ups, and it's
important to detect regressions on both sides: the toolchain,
if fewer methods get devirtualized after an update, and Chrome,
if an innocently looking change caused many hot methods become
virtual again.

The need to track devirtualized methods is not Chrome-specific,
but it's probably the only user of the pass at this time.

Reviewers: kcc

Differential Revision: https://reviews.llvm.org/D23219

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277856 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-05 19:45:16 +00:00
David Callahan
853b86f80a [ADCE] Refactoring for new functionality (NFC)
Summary:
This is another refactoring to break up the one function into three logical components functions.
Another non-functional change before we start added in features.

Reviewers: nadav, mehdi_amini, majnemer

Subscribers: twoh, freik, llvm-commits

Differential Revision: https://reviews.llvm.org/D23102

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277855 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-05 19:38:11 +00:00
Dehao Chen
9fb630e4f0 Do not assign new discriminator for all intrinsics.
Summary: We do not care about intrinsic calls when assigning discriminators.

Reviewers: davidxl, dnovillo

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D23212

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277843 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-05 17:56:49 +00:00
Benjamin Kramer
904a5364dd [SimplifyCFG] Make range reduction code deterministic.
This generated IR based on the order of evaluation, which is different
between GCC and Clang. With that in mind you get bootstrap miscompares
if you compare a Clang built with GCC-built Clang vs. Clang built with
Clang-built Clang. Diagnosing that made my head hurt.

This also reverts commit r277337, which "fixed" the test case.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277820 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-05 14:55:02 +00:00
Nicolai Haehnle
fd14e4374d [InstCombine] try to fold (select C, (sext A), B) into logical ops
Summary:
Turn (select C, (sext A), B) into (sext (select C, A, B')) when A is i1 and
B is a compatible constant, also for zext instead of sext. This will then be
further folded into logical operations.

The transformation would be valid for non-i1 types as well, but other parts of
InstCombine prefer to have sext from non-i1 as an operand of select.

Motivated by the shader compiler frontend in Mesa for AMDGPU, which emits i32
for boolean operations. With this change, the boolean logic is fully
recovered.

Reviewers: majnemer, spatel, tstellarAMD

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D22747

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277801 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-05 08:22:29 +00:00
Justin Bogner
784afcbf37 InstCombine: Clean up some trailing whitespace. NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277793 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-05 01:09:48 +00:00
Justin Bogner
afba697b6c InstCombine: Replace some never-null pointers with references. NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277792 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-05 01:06:44 +00:00
Sebastian Pop
412eaded02 GVN-hoist: enable by default
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277786 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 23:49:07 +00:00
Sebastian Pop
1fc6fa722b GVN-hoist: fix early exit logic
The patch splits a complex && if condition into easier to read and understand
logic.  That wrong early exit condition was letting some instructions with not
all operands available pass through when HoistingGeps was true.

Differential Revision: https://reviews.llvm.org/D23174

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277785 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 23:49:05 +00:00
Justin Bogner
05d8fd3707 IR: Provide an IRBuilder Inserter that calls a callback after insertion
Add a generalized IRBuilderCallbackInserter, which is just given a
callback to execute after insertion. This can be used to get rid of
the custom inserter in InstCombine, which will in turn allow me to add
target specific InstCombineCalls API for intrinsics without horrible
layering violations.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277784 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 23:41:01 +00:00
Michael Kuperstein
e788186982 [LV, X86] Be more optimistic about vectorizing shifts.
Shifts with a uniform but non-constant count were considered very expensive to
vectorize, because the splat of the uniform count and the shift would tend to
appear in different blocks. That made the splat invisible to ISel, and we'd
scalarize the shift at codegen time.

Since r201655, CodeGenPrepare sinks those splats to be next to their use, and we
are able to select the appropriate vector shifts. This updates the cost model to
to take this into account by making shifts by a uniform cheap again.

Differential Revision: https://reviews.llvm.org/D23049


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277782 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 22:48:03 +00:00
Sanjay Patel
9615dd011e [InstCombine] use m_APInt to allow icmp eq (mul X, C1), C2 folds for splat constant vectors
This concludes the splat vector enhancements for foldICmpEqualityWithConstant().
Other commits in this series:
https://reviews.llvm.org/rL277762
https://reviews.llvm.org/rL277752
https://reviews.llvm.org/rL277738
https://reviews.llvm.org/rL277731
https://reviews.llvm.org/rL277659
https://reviews.llvm.org/rL277638
https://reviews.llvm.org/rL277629



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277779 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 22:19:27 +00:00
Matt Arsenault
ca17b84bf9 GVNHoist: Don't hoist convergent calls
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277767 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 20:52:57 +00:00
David Majnemer
5964d136e5 [coroutines] Part 4[ab]: Coroutine Devirtualization: Lower coro.resume and coro.destroy.
This is the forth patch in the coroutine series. CoroEaly pass now lowers coro.resume
and coro.destroy intrinsics by replacing them with an indirect call to an address
returned by coro.subfn.addr intrinsic. This is done so that CGPassManager recognizes
devirtualization when CoroElide replaces a call to coro.subfn.addr with an appropriate
function address.

Patch by Gor Nishanov!

Differential Revision: https://reviews.llvm.org/D22998

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277765 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 20:30:07 +00:00
Sanjay Patel
0d2bdafffd [InstCombine] use m_APInt to allow icmp eq (and X, C1), C2 folds for splat constant vectors
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277762 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 20:05:02 +00:00
Sanjay Patel
8c8f13e353 [InstCombine] use m_APInt to allow icmp eq (or X, C1), C2 folds for splat constant vectors
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277752 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 19:12:12 +00:00
Sanjay Patel
47b6d6791b [InstCombine] use m_APInt to allow icmp eq (op X, Y), C folds for splat constant vectors
I'm removing a misplaced pair of more specific folds from InstCombine in this patch as well,
so we know where those folds are happening in InstSimplify.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277738 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 17:48:04 +00:00
Alina Sbirlea
4ebfadfe76 LoadStoreVectorizer: Remove TargetBaseAlign. Keep alignment for stack adjustments.
Summary:
TargetBaseAlign is no longer required since LSV checks if target allows misaligned accesses.
A constant defining a base alignment is still needed for stack accesses where alignment can be adjusted.

Previous patch (D22936) was reverted because tests were failing. This patch also fixes the cause of those failures:
- x86 failing tests either did not have the right target, or the right alignment.
- NVPTX failing tests did not have the right alignment.
- AMDGPU failing test (merge-stores) should allow vectorization with the given alignment but the target info
  considers <3xi32> a non-standard type and gives up early. This patch removes the condition and only checks
  for a maximum size allowed and relies on the next condition checking for %4 for correctness.
  This should be revisited to include 3xi32 as a MVT type (on arsenm's non-immediate todo list).

Note that checking the sizeInBits for a MVT is undefined (leads to an assertion failure),
so we need to create an EVT, hence the interface change in allowsMisaligned to include the Context.

Reviewers: arsenm, jlebar, tstellarAMD

Subscribers: jholewinski, arsenm, mzolotukhin, llvm-commits

Differential Revision: https://reviews.llvm.org/D23068

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277735 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 16:38:44 +00:00
Sanjay Patel
bd9e8a1faf [InstCombine] use m_APInt to allow icmp eq (sub C1, X), C2 folds for splat constant vectors
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277731 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 15:19:25 +00:00
Amaury Sechet
e56e9e73a2 Add popcount(n) == bitsize(n) -> n == -1 transformation.
Summary: As per title.

Reviewers: majnemer, spatel

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D23139

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277694 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 05:27:20 +00:00
David Majnemer
ad1fd74c16 Forgot the dyn_cast_or_null intended for r277691.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277693 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 04:47:18 +00:00
David Majnemer
8da786cb44 Reinstate "[CloneFunction] Don't remove side effecting calls"
This reinstates r277611 + r277614 and reverts r277642.  A cast_or_null
should have been a dyn_cast_or_null.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277691 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 04:24:02 +00:00
Bruno Cardoso Lopes
b290294cc9 Revert "GVN-hoist: enable by default" & "Make GVN Hoisting obey optnone/bisect."
This reverts commits r277685 & r277688. r277685 broke compiler-rt
compilation http://lab.llvm.org:8080/green/job/clang-stage1-configure-RA_build/23335
and r277685 is a followup from it.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277690 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 04:16:24 +00:00
Sebastian Pop
e718640897 GVN-hoist: enable by default
As we addressed all compilation time problems with GVN-hoist
https://llvm.org/bugs/show_bug.cgi?id=28670
this patch turns GVN-hoist back by default.

Differential Revision: https://reviews.llvm.org/D23136

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277685 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 01:59:42 +00:00
Sanjay Patel
f29318e873 [InstCombine] use m_APInt to allow icmp eq (add X, C1), C2 folds for splat constant vectors
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277659 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-03 22:08:44 +00:00
George Burgess IV
0a9d62e07a [MSSA] Fix a bug in MemorySSA's move ctor.
Not a correctness issue, but it would be nice if we didn't have to
recompute our block numbering (worst-case) every time we move MSSA.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277652 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-03 21:07:52 +00:00
Sebastian Pop
48b1e390be GVN-hoist: limit the length of dependent instructions
Limit the number of times the while(1) loop is executed. With this restriction
the number of hoisted instructions does not change in a significant way on the
test-suite.

Differential Revision: https://reviews.llvm.org/D23028

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277651 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-03 20:54:38 +00:00
Sebastian Pop
c30fea992e GVN-hoist: compute DFS numbers once
With this patch we compute the DFS numbers of instructions only once and update
them during the code generation when an instruction gets hoisted.

Differential Revision: https://reviews.llvm.org/D23021

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277650 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-03 20:54:36 +00:00
Sebastian Pop
a9161e1912 GVN-hoist: compute MSSA once per function (PR28670)
With this patch we compute the MemorySSA once and update it in the code generator.

Differential Revision: https://reviews.llvm.org/D22966

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277649 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-03 20:54:33 +00:00
Reid Kleckner
8c1e5c7a43 Revert "[CloneFunction] Don't remove side effecting calls"
This reverts commit r277611 and the followup r277614.

Bootstrap builds and chromium builds are crashing during inlining after
this change.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277642 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-03 20:01:01 +00:00
George Burgess IV
9cdc9dad95 [MSSA] clang-format. NFC.
Didn't want to fold this in with r277640, since it touches bits that
aren't entirely related to r277640.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277641 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-03 19:59:11 +00:00
George Burgess IV
cd112f0139 [MSSA] Add special handling for invariant/constant loads.
This is a follow-up to r277637. It teaches MemorySSA that invariant
loads (and loads of provably constant memory) are always liveOnEntry.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277640 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-03 19:57:02 +00:00
Sanjay Patel
c6b62aa3e7 [InstCombine] use m_APInt to allow icmp eq (srem X, C1), C2 folds for splat constant vectors
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277638 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-03 19:48:40 +00:00