/*
 * Copyright 2008 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.dev.jjs.impl.gflow.copy;

import com.google.gwt.dev.jjs.ast.JLocal;
import com.google.gwt.dev.jjs.ast.JParameter;
import com.google.gwt.dev.jjs.ast.JVariable;
import com.google.gwt.dev.jjs.ast.JVariableRef;
import com.google.gwt.dev.jjs.impl.gflow.AssumptionMap;
import com.google.gwt.dev.jjs.impl.gflow.AssumptionUtil;
import com.google.gwt.dev.jjs.impl.gflow.FlowFunction;
import com.google.gwt.dev.jjs.impl.gflow.cfg.Cfg;
import com.google.gwt.dev.jjs.impl.gflow.cfg.CfgEdge;
import com.google.gwt.dev.jjs.impl.gflow.cfg.CfgNode;
import com.google.gwt.dev.jjs.impl.gflow.cfg.CfgReadWriteNode;
import com.google.gwt.dev.jjs.impl.gflow.cfg.CfgVisitor;
import com.google.gwt.dev.jjs.impl.gflow.cfg.CfgWriteNode;
import com.google.gwt.dev.jjs.impl.gflow.copy.CopyAssumption.Updater;

/**  
 * Flow function for CopyAnalysis.
 */
public class CopyFlowFunction implements
    FlowFunction<CfgNode<?>, CfgEdge, Cfg, CopyAssumption> {
  public void interpret(CfgNode<?> node,
      Cfg g, AssumptionMap<CfgEdge, CopyAssumption> assumptionMap) {
    CopyAssumption in = AssumptionUtil.join(g.getInEdges(node), assumptionMap);
    final Updater result = new Updater(in);

    node.accept(new CfgVisitor() {
      @Override
      public void visitReadWriteNode(CfgReadWriteNode node) {
        JVariable targetVariable = node.getTargetVariable();
        if (isSupportedVar(targetVariable)) {
          result.kill(targetVariable);
        }
      }

      @Override
      public void visitWriteNode(CfgWriteNode node) {
        JVariable targetVariable = node.getTargetVariable();
        if (!isSupportedVar(targetVariable)) {
          return;
        }

        if (!(node.getValue() instanceof JVariableRef)) {
          result.kill(targetVariable);
          return;
        }
        
        JVariable original = ((JVariableRef) node.getValue()).getTarget();
        original = result.getMostOriginal(original);
        
        if (original != targetVariable) {
          result.kill(targetVariable);
          if (isSupportedVar(original)) {
            result.addCopy(original, targetVariable);
          }
        } else {
          // We don't have to kill any assumptions after i = i assignment.
        }
      }

      private boolean isSupportedVar(JVariable targetVariable) {
        return targetVariable instanceof JParameter ||
            targetVariable instanceof JLocal;
      }
    });

    AssumptionUtil.setAssumptions(g.getOutEdges(node), result.unwrap(), assumptionMap);
  }
}
