001    /*
002     *  This file is part of the Jikes RVM project (http://jikesrvm.org).
003     *
004     *  This file is licensed to You under the Eclipse Public License (EPL);
005     *  You may not use this file except in compliance with the License. You
006     *  may obtain a copy of the License at
007     *
008     *      http://www.opensource.org/licenses/eclipse-1.0.php
009     *
010     *  See the COPYRIGHT.txt file distributed with this work for information
011     *  regarding copyright ownership.
012     */
013    package org.jikesrvm.compilers.opt.escape;
014    
015    import java.util.HashMap;
016    import org.jikesrvm.compilers.opt.ir.Register;
017    
018    /**
019     * This class holds the results of a flow-insensitive escape analysis
020     * for a method.
021     */
022    class FI_EscapeSummary {
023    
024      /**
025       * Returns {@code true} iff ANY object pointed to by symbolic register r
026       * MUST be thread local
027       */
028      boolean isThreadLocal(Register r) {
029        Object result = hash.get(r);
030        return result != null && result == THREAD_LOCAL;
031      }
032    
033      /**
034       * Returns {@code true} iff ANY object pointed to by symbolic register r
035       * MUST be method local
036       */
037      boolean isMethodLocal(Register r) {
038        Object result = hash2.get(r);
039        return result != null && result == METHOD_LOCAL;
040      }
041    
042      /**
043       * record the fact that ALL object pointed to by symbolic register r
044       * MUST (or may) escape this thread
045       */
046      void setThreadLocal(Register r, boolean b) {
047        if (b) {
048          hash.put(r, THREAD_LOCAL);
049        } else {
050          hash.put(r, MAY_ESCAPE_THREAD);
051        }
052      }
053    
054      /**
055       * Record the fact that ALL object pointed to by symbolic register r
056       * MUST (or may) escape this method
057       */
058      void setMethodLocal(Register r, boolean b) {
059        if (b) {
060          hash2.put(r, METHOD_LOCAL);
061        } else {
062          hash2.put(r, MAY_ESCAPE_METHOD);
063        }
064      }
065    
066      /* Implementation */
067      /**
068       * A mapping that holds the analysis result for thread-locality for each
069       * Register.
070       */
071      private final HashMap<Register, Object> hash = new HashMap<Register, Object>();
072    
073      /**
074       * A mapping that holds the analysis result for method-locality for each
075       * Register.
076       */
077      private final HashMap<Register, Object> hash2 = new HashMap<Register, Object>();
078    
079      /**
080       * Static object used to represent analysis result
081       */
082      static final Object THREAD_LOCAL = new Object();
083      /**
084       * Static object used to represent analysis result
085       */
086      static final Object MAY_ESCAPE_THREAD = new Object();
087      /**
088       * Static object used to represent analysis result
089       */
090      static final Object METHOD_LOCAL = new Object();
091      /**
092       * Static object used to represent analysis result
093       */
094      static final Object MAY_ESCAPE_METHOD = new Object();
095    }
096    
097    
098