/*
- * Copyright (C) 2015 Apple Inc. All rights reserved.
+ * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef DFGCombinedLiveness_h
-#define DFGCombinedLiveness_h
+#pragma once
#if ENABLE(DFG_JIT)
namespace JSC { namespace DFG {
// Returns the set of nodes live at tail, both due to due DFG and due to bytecode (i.e. OSR exit).
-HashSet<Node*> liveNodesAtHead(Graph&, BasicBlock*);
+NodeSet liveNodesAtHead(Graph&, BasicBlock*);
+// WARNING: This currently does not reason about the liveness of shadow values. The execution
+// semantics of DFG SSA are that an Upsilon stores to the shadow value of a Phi, and the Phi loads
+// from that shadow value. Hence, the shadow values are like variables, and have liveness. The normal
+// liveness analysis will tell you about the liveness of shadow values. It's OK to ignore shadow
+// values if you treat Upsilon as an opaque escape, and all of the clients of CombinedLiveness do so.
struct CombinedLiveness {
CombinedLiveness() { }
CombinedLiveness(Graph&);
- BlockMap<HashSet<Node*>> liveAtHead;
- BlockMap<HashSet<Node*>> liveAtTail;
+ BlockMap<NodeSet> liveAtHead;
+ BlockMap<NodeSet> liveAtTail;
};
} } // namespace JSC::DFG
#endif // ENABLE(DFG_JIT)
-
-#endif // DFGCombinedLiveness_h
-