src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/FixedInterval.java
branchJDK-8200758-branch
changeset 57069 b8385a806d2b
parent 57068 eb6d315c4e39
parent 52934 8deeb7bba516
child 57070 42783e8e73de
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/FixedInterval.java	Mon Dec 10 16:49:54 2018 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,266 +0,0 @@
-/*
- * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-package org.graalvm.compiler.lir.alloc.trace.lsra;
-
-import static jdk.vm.ci.code.ValueUtil.asRegister;
-import static jdk.vm.ci.code.ValueUtil.isRegister;
-
-import org.graalvm.compiler.lir.LIRInstruction;
-
-import jdk.vm.ci.meta.AllocatableValue;
-import jdk.vm.ci.meta.Value;
-
-/**
- * Represents a fixed interval.
- */
-final class FixedInterval extends IntervalHint {
-
-    /**
-     * The fixed operand of this interval.
-     */
-    public final AllocatableValue operand;
-
-    /**
-     * The head of the list of ranges describing this interval. This list is sorted by
-     * {@linkplain LIRInstruction#id instruction ids}.
-     */
-    private FixedRange first;
-
-    /**
-     * Iterator used to traverse the ranges of an interval.
-     */
-    private FixedRange current;
-
-    /**
-     * Link to next interval in a sorted list of intervals that ends with {@link #EndMarker}.
-     */
-    FixedInterval next;
-
-    private int cachedTo; // cached value: to of last range (-1: not cached)
-
-    public FixedRange first() {
-        return first;
-    }
-
-    @Override
-    public int from() {
-        return first.from;
-    }
-
-    public int to() {
-        if (cachedTo == -1) {
-            cachedTo = calcTo();
-        }
-        assert cachedTo == calcTo() : "invalid cached value";
-        return cachedTo;
-    }
-
-    // test intersection
-    boolean intersects(TraceInterval i) {
-        return first.intersects(i);
-    }
-
-    int intersectsAt(TraceInterval i) {
-        return first.intersectsAt(i);
-    }
-
-    // range iteration
-    void rewindRange() {
-        current = first;
-    }
-
-    void nextRange() {
-        assert this != EndMarker : "not allowed on sentinel";
-        current = current.next;
-    }
-
-    int currentFrom() {
-        return current.from;
-    }
-
-    int currentTo() {
-        return current.to;
-    }
-
-    boolean currentAtEnd() {
-        return current == FixedRange.EndMarker;
-    }
-
-    boolean currentIntersects(TraceInterval it) {
-        return current.intersects(it);
-    }
-
-    int currentIntersectsAt(TraceInterval it) {
-        return current.intersectsAt(it);
-    }
-
-    // range creation
-    public void setFrom(int from) {
-        assert !isEmpty();
-        first().from = from;
-    }
-
-    private boolean isEmpty() {
-        return first() == FixedRange.EndMarker;
-    }
-
-    public void addRange(int from, int to) {
-        if (isEmpty()) {
-            first = new FixedRange(from, to, first());
-            return;
-        }
-        if (to <= to() && from >= from()) {
-            return;
-        }
-        if (from() == to) {
-            first().from = from;
-        } else {
-            first = new FixedRange(from, to, first());
-        }
-    }
-
-    @Override
-    public AllocatableValue location() {
-        return operand;
-    }
-
-    /**
-     * Sentinel interval to denote the end of an interval list.
-     */
-    static final FixedInterval EndMarker = new FixedInterval(Value.ILLEGAL);
-
-    FixedInterval(AllocatableValue operand) {
-        assert operand != null;
-        this.operand = operand;
-        this.first = FixedRange.EndMarker;
-        this.current = FixedRange.EndMarker;
-        this.next = FixedInterval.EndMarker;
-        this.cachedTo = -1;
-    }
-
-    int calcTo() {
-        assert first != FixedRange.EndMarker : "interval has no range";
-
-        FixedRange r = first;
-        while (r.next != FixedRange.EndMarker) {
-            r = r.next;
-        }
-        return r.to;
-    }
-
-    // returns true if the opId is inside the interval
-    boolean covers(int opId, LIRInstruction.OperandMode mode) {
-        FixedRange cur = first;
-
-        while (cur != FixedRange.EndMarker && cur.to < opId) {
-            cur = cur.next;
-        }
-        if (cur != FixedRange.EndMarker) {
-            assert cur.to != cur.next.from : "ranges not separated";
-
-            if (mode == LIRInstruction.OperandMode.DEF) {
-                return cur.from <= opId && opId < cur.to;
-            } else {
-                return cur.from <= opId && opId <= cur.to;
-            }
-        }
-        return false;
-    }
-
-    // returns true if the interval has any hole between holeFrom and holeTo
-    // (even if the hole has only the length 1)
-    boolean hasHoleBetween(int holeFrom, int holeTo) {
-        assert holeFrom < holeTo : "check";
-        assert from() <= holeFrom && holeTo <= to() : "index out of interval";
-
-        FixedRange cur = first;
-        while (cur != FixedRange.EndMarker) {
-            assert cur.to < cur.next.from : "no space between ranges";
-
-            // hole-range starts before this range . hole
-            if (holeFrom < cur.from) {
-                return true;
-
-                // hole-range completely inside this range . no hole
-            } else {
-                if (holeTo <= cur.to) {
-                    return false;
-
-                    // overlapping of hole-range with this range . hole
-                } else {
-                    if (holeFrom <= cur.to) {
-                        return true;
-                    }
-                }
-            }
-
-            cur = cur.next;
-        }
-
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        if (this == EndMarker) {
-            return "EndMarker [?,?]";
-        }
-        String from = "?";
-        String to = "?";
-        if (first != null && first != FixedRange.EndMarker) {
-            from = String.valueOf(from());
-            // to() may cache a computed value, modifying the current object, which is a bad idea
-            // for a printing function. Compute it directly instead.
-            to = String.valueOf(calcTo());
-        }
-        String locationString = "@" + this.operand;
-        return asRegister(operand).number + ":" + operand + (isRegister(operand) ? "" : locationString) + "[" + from + "," + to + "]";
-    }
-
-    /**
-     * Gets a single line string for logging the details of this interval to a log stream.
-     */
-    @Override
-    public String logString() {
-        StringBuilder buf = new StringBuilder(100);
-        buf.append("fix ").append(asRegister(operand).number).append(':').append(operand).append(' ');
-
-        buf.append(" ranges{");
-
-        // print ranges
-        FixedRange cur = first;
-        while (cur != FixedRange.EndMarker) {
-            if (cur != first) {
-                buf.append(", ");
-            }
-            buf.append(cur);
-            cur = cur.next;
-            assert cur != null : "range list not closed with range sentinel";
-        }
-        buf.append("}");
-        return buf.toString();
-    }
-
-}