1/*
2 * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27#include "B3Effects.h"
28
29#if ENABLE(B3_JIT)
30
31#include <wtf/CommaPrinter.h>
32#include <wtf/DataLog.h>
33
34namespace JSC { namespace B3 {
35
36namespace {
37
38// These helpers cascade in such a way that after the helper for terminal, we don't have to worry
39// about terminal again, since the terminal case considers all ways that a terminal may interfere
40// with something else. And after the exit sideways case, we don't have to worry about either
41// exitsSideways or terminal. And so on...
42
43bool interferesWithTerminal(const Effects& terminal, const Effects& other)
44{
45 if (!terminal.terminal)
46 return false;
47 return other.terminal || other.controlDependent || other.writesLocalState || other.writes || other.writesPinned;
48}
49
50bool interferesWithExitSideways(const Effects& exitsSideways, const Effects& other)
51{
52 if (!exitsSideways.exitsSideways)
53 return false;
54 return other.controlDependent || other.writes || other.writesPinned;
55}
56
57bool interferesWithWritesLocalState(const Effects& writesLocalState, const Effects& other)
58{
59 if (!writesLocalState.writesLocalState)
60 return false;
61 return other.writesLocalState || other.readsLocalState;
62}
63
64bool interferesWithWritesPinned(const Effects& writesPinned, const Effects& other)
65{
66 if (!writesPinned.writesPinned)
67 return false;
68 return other.writesPinned || other.readsPinned;
69}
70
71} // anonymous namespace
72
73bool Effects::interferes(const Effects& other) const
74{
75 return interferesWithTerminal(*this, other)
76 || interferesWithTerminal(other, *this)
77 || interferesWithExitSideways(*this, other)
78 || interferesWithExitSideways(other, *this)
79 || interferesWithWritesLocalState(*this, other)
80 || interferesWithWritesLocalState(other, *this)
81 || interferesWithWritesPinned(*this, other)
82 || interferesWithWritesPinned(other, *this)
83 || writes.overlaps(other.writes)
84 || writes.overlaps(other.reads)
85 || reads.overlaps(other.writes)
86 || (fence && other.fence);
87}
88
89bool Effects::operator==(const Effects& other) const
90{
91 return terminal == other.terminal
92 && exitsSideways == other.exitsSideways
93 && controlDependent == other.controlDependent
94 && writesLocalState == other.writesLocalState
95 && readsLocalState == other.readsLocalState
96 && writesPinned == other.writesPinned
97 && readsPinned == other.readsPinned
98 && writes == other.writes
99 && reads == other.reads
100 && fence == other.fence;
101}
102
103bool Effects::operator!=(const Effects& other) const
104{
105 return !(*this == other);
106}
107
108void Effects::dump(PrintStream& out) const
109{
110 CommaPrinter comma("|");
111 if (terminal)
112 out.print(comma, "Terminal");
113 if (exitsSideways)
114 out.print(comma, "ExitsSideways");
115 if (controlDependent)
116 out.print(comma, "ControlDependent");
117 if (writesLocalState)
118 out.print(comma, "WritesLocalState");
119 if (readsLocalState)
120 out.print(comma, "ReadsLocalState");
121 if (writesPinned)
122 out.print(comma, "WritesPinned");
123 if (readsPinned)
124 out.print(comma, "ReadsPinned");
125 if (fence)
126 out.print(comma, "Fence");
127 if (writes)
128 out.print(comma, "Writes:", writes);
129 if (reads)
130 out.print(comma, "Reads:", reads);
131}
132
133} } // namespace JSC::B3
134
135#endif // ENABLE(B3_JIT)
136
137