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