11465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee/*
21465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * Copyright (C) 2009 The Android Open Source Project
31465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee *
41465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * Licensed under the Apache License, Version 2.0 (the "License");
51465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * you may not use this file except in compliance with the License.
61465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * You may obtain a copy of the License at
71465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee *
81465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee *      http://www.apache.org/licenses/LICENSE-2.0
91465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee *
101465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * Unless required by applicable law or agreed to in writing, software
111465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * distributed under the License is distributed on an "AS IS" BASIS,
121465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * See the License for the specific language governing permissions and
141465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * limitations under the License.
151465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee */
161465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee
171465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee#include "Dalvik.h"
181465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee#include "CompilerInternals.h"
191465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee#include "Dataflow.h"
201465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee
211465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee/*
221465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * Quick & dirty - make FP usage sticky.  This is strictly a hint - local
231465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * code generation will handle misses.  It might be worthwhile to collaborate
241465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * with dx/dexopt to avoid reusing the same Dalvik temp for values of
251465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * different types.
261465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee */
271465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbeestatic void inferTypes(CompilationUnit *cUnit, BasicBlock *bb)
281465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee{
291465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    MIR *mir;
3032115a971ea00ab2421fab4e4a3afa6c50c82173Ben Cheng    if (bb->blockType != kDalvikByteCode && bb->blockType != kEntryBlock)
311465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee        return;
321465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee
331465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    for (mir = bb->firstMIRInsn; mir; mir = mir->next) {
341465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee        SSARepresentation *ssaRep = mir->ssaRep;
351465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee        if (ssaRep) {
361465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee            int i;
371465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee            for (i=0; ssaRep->fpUse && i< ssaRep->numUses; i++) {
381465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee                if (ssaRep->fpUse[i])
391465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee                    cUnit->regLocation[ssaRep->uses[i]].fp = true;
401465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee            }
411465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee            for (i=0; ssaRep->fpDef && i< ssaRep->numDefs; i++) {
421465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee                if (ssaRep->fpDef[i])
431465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee                    cUnit->regLocation[ssaRep->defs[i]].fp = true;
441465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee            }
451465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee        }
461465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    }
471465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee}
481465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee
4923d95d0e2d45f5c3434536b3bc20c8b4c3331ed3buzbeestatic const RegLocation freshLoc = {kLocDalvikFrame, 0, 0, INVALID_REG,
5023d95d0e2d45f5c3434536b3bc20c8b4c3331ed3buzbee                                     INVALID_REG, INVALID_SREG};
511465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee
521465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee/*
5323d95d0e2d45f5c3434536b3bc20c8b4c3331ed3buzbee * Local register allocation for simple traces.  Most of the work for
5423d95d0e2d45f5c3434536b3bc20c8b4c3331ed3buzbee * local allocation is done on the fly.  Here we do some initialization
5523d95d0e2d45f5c3434536b3bc20c8b4c3331ed3buzbee * and type inference.
561465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee */
5723d95d0e2d45f5c3434536b3bc20c8b4c3331ed3buzbeevoid dvmCompilerLocalRegAlloc(CompilationUnit *cUnit)
581465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee{
591465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    int i;
601465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    RegLocation *loc;
611465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee
621465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    /* Allocate the location map */
631465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    loc = (RegLocation*)dvmCompilerNew(cUnit->numSSARegs * sizeof(*loc), true);
641465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    for (i=0; i< cUnit->numSSARegs; i++) {
651465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee        loc[i] = freshLoc;
661465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee        loc[i].sRegLow = i;
671465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    }
681465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    cUnit->regLocation = loc;
691465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee
7000603079b8723b32c955513eae63a8f97898074dBen Cheng    GrowableListIterator iterator;
7100603079b8723b32c955513eae63a8f97898074dBen Cheng
7200603079b8723b32c955513eae63a8f97898074dBen Cheng    dvmGrowableListIteratorInit(&cUnit->blockList, &iterator);
731465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    /* Do type inference pass */
7400603079b8723b32c955513eae63a8f97898074dBen Cheng    while (true) {
7500603079b8723b32c955513eae63a8f97898074dBen Cheng        BasicBlock *bb = (BasicBlock *) dvmGrowableListIteratorNext(&iterator);
7600603079b8723b32c955513eae63a8f97898074dBen Cheng        if (bb == NULL) break;
7700603079b8723b32c955513eae63a8f97898074dBen Cheng        inferTypes(cUnit, bb);
781465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    }
791465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee
8023d95d0e2d45f5c3434536b3bc20c8b4c3331ed3buzbee    /* Remap SSA names back to original frame locations. */
8123d95d0e2d45f5c3434536b3bc20c8b4c3331ed3buzbee    for (i=0; i < cUnit->numSSARegs; i++) {
8223d95d0e2d45f5c3434536b3bc20c8b4c3331ed3buzbee        cUnit->regLocation[i].sRegLow =
831465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee                DECODE_REG(dvmConvertSSARegToDalvik(cUnit, loc[i].sRegLow));
841465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    }
851465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee}
86