Search in sources :

Example 1 with PhiInstruction

use of com.oracle.truffle.llvm.parser.model.symbols.instructions.PhiInstruction in project sulong by graalvm.

the class LLVMLivenessAnalysis method initializeGenKill.

private static BlockInfo[] initializeGenKill(FrameDescriptor frame, Map<InstructionBlock, List<LLVMPhiManager.Phi>> phis, FunctionDefinition functionDefinition, List<InstructionBlock> blocks) {
    BlockInfo[] result = new BlockInfo[blocks.size()];
    for (int i = 0; i < blocks.size(); i++) {
        InstructionBlock block = blocks.get(i);
        BlockInfo blockInfo = result[i] = new BlockInfo(frame.getSize());
        if (i == 0) {
            // in the first block, the arguments are also always alive
            for (FunctionParameter param : functionDefinition.getParameters()) {
                processRead(blockInfo, frame.findFrameSlot(param.getName()).getIndex());
            }
        }
        LLVMLivenessReadVisitor readVisitor = new LLVMLivenessReadVisitor(frame, blockInfo);
        for (int j = 0; j < block.getInstructionCount(); j++) {
            Instruction instruction = block.getInstruction(j);
            if (instruction instanceof PhiInstruction) {
                processPhiWrite(frame, (PhiInstruction) instruction, blockInfo);
            } else {
                processReads(readVisitor, instruction);
                processWrite(frame, instruction, blockInfo);
            }
        }
        List<LLVMPhiManager.Phi> bbPhis = phis.getOrDefault(block, Collections.emptyList());
        for (LLVMPhiManager.Phi phi : bbPhis) {
            processValueUsedInPhi(frame, phi.getValue(), blockInfo);
        }
    }
    return result;
}
Also used : PhiInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.PhiInstruction) InstructionBlock(com.oracle.truffle.llvm.parser.model.blocks.InstructionBlock) Instruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.Instruction) CompareExchangeInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.CompareExchangeInstruction) TerminatingInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.TerminatingInstruction) BranchInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.BranchInstruction) LoadInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.LoadInstruction) InsertElementInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.InsertElementInstruction) DbgValueInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.DbgValueInstruction) DbgDeclareInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.DbgDeclareInstruction) ResumeInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.ResumeInstruction) ConditionalBranchInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.ConditionalBranchInstruction) CastInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.CastInstruction) ExtractValueInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.ExtractValueInstruction) StoreInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.StoreInstruction) SwitchInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.SwitchInstruction) ReadModifyWriteInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.ReadModifyWriteInstruction) SwitchOldInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.SwitchOldInstruction) CallInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.CallInstruction) VoidInvokeInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.VoidInvokeInstruction) CompareInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.CompareInstruction) BinaryOperationInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.BinaryOperationInstruction) GetElementPointerInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.GetElementPointerInstruction) PhiInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.PhiInstruction) FenceInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.FenceInstruction) SelectInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.SelectInstruction) AllocateInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.AllocateInstruction) VoidCallInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.VoidCallInstruction) LandingpadInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.LandingpadInstruction) ExtractElementInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.ExtractElementInstruction) UnreachableInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.UnreachableInstruction) ReturnInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.ReturnInstruction) ShuffleVectorInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.ShuffleVectorInstruction) IndirectBranchInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.IndirectBranchInstruction) InvokeInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.InvokeInstruction) InsertValueInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.InsertValueInstruction) FunctionParameter(com.oracle.truffle.llvm.parser.model.functions.FunctionParameter)

Example 2 with PhiInstruction

use of com.oracle.truffle.llvm.parser.model.symbols.instructions.PhiInstruction in project sulong by graalvm.

the class LLVMLivenessAnalysis method computeLivenessAnalysisResult.

private static LLVMLivenessAnalysisResult computeLivenessAnalysisResult(FunctionDefinition functionDefinition, List<InstructionBlock> blocks, FrameDescriptor frame, BlockInfo[] blockInfos, ArrayList<InstructionBlock>[] predecessors) {
    @SuppressWarnings("unchecked") ArrayList<NullerInformation>[] nullableWithinBlock = new ArrayList[blocks.size()];
    BitSet[] nullableBeforeBlock = new BitSet[blocks.size()];
    BitSet[] nullableAfterBlock = new BitSet[blocks.size()];
    int[] lastInstructionIndexTouchingLocal = new int[frame.getSize()];
    LLVMNullerReadVisitor nullerReadVisitor = new LLVMNullerReadVisitor(frame, lastInstructionIndexTouchingLocal);
    for (int i = 0; i < blocks.size(); i++) {
        ArrayList<NullerInformation> blockNullers = new ArrayList<>();
        Arrays.fill(lastInstructionIndexTouchingLocal, -1);
        BlockInfo blockInfo = blockInfos[i];
        // we destroy the kill and phiDefs bitsets as they are no longer needed anyways
        blockInfo.kill.clear();
        blockInfo.phiDefs.clear();
        if (i == 0) {
            // instruction
            for (FunctionParameter param : functionDefinition.getParameters()) {
                int frameSlotIndex = frame.findFrameSlot(param.getName()).getIndex();
                lastInstructionIndexTouchingLocal[frameSlotIndex] = 0;
            }
        }
        InstructionBlock block = blocks.get(i);
        for (int j = 0; j < block.getInstructionCount(); j++) {
            Instruction instruction = block.getInstruction(j);
            if (instruction instanceof PhiInstruction) {
            // we need to skip the reads of phi nodes as they belong to a different block
            } else {
                nullerReadVisitor.setInstructionIndex(j);
                instruction.accept(nullerReadVisitor);
            }
            int frameSlotIndex = resolve(frame, instruction);
            if (frameSlotIndex >= 0) {
                // the write)
                if (lastInstructionIndexTouchingLocal[frameSlotIndex] != -1 && lastInstructionIndexTouchingLocal[frameSlotIndex] != j) {
                    blockNullers.add(new NullerInformation(frameSlotIndex, lastInstructionIndexTouchingLocal[frameSlotIndex]));
                }
                lastInstructionIndexTouchingLocal[frameSlotIndex] = j;
            }
        }
        // compute the values that die in this block. we do that in place, i.e., we destroy the
        // def bitset that is no longer needed anyways.
        blockInfo.defs.or(blockInfo.in);
        blockInfo.defs.andNot(blockInfo.out);
        int terminatingInstructionIndex = block.getInstructionCount() - 1;
        BitSet valuesThatDieInBlock = blockInfo.defs;
        int bitIndex = -1;
        while ((bitIndex = valuesThatDieInBlock.nextSetBit(bitIndex + 1)) >= 0) {
            assert lastInstructionIndexTouchingLocal[bitIndex] >= 0 : "must have a last usage, otherwise the value would not be alive in this block";
            if (blockInfo.phiUses.get(bitIndex) || lastInstructionIndexTouchingLocal[bitIndex] == terminatingInstructionIndex) {
                // if a value dies that is used in a phi function or in a terminating
                // instruction, it dies after the block
                blockInfo.phiDefs.set(bitIndex);
            } else {
                blockNullers.add(new NullerInformation(bitIndex, lastInstructionIndexTouchingLocal[bitIndex]));
            }
        }
        // compute the values that can be nulled out before we enter this block.
        for (InstructionBlock predecessor : predecessors[i]) {
            BlockInfo predInfo = blockInfos[predecessor.getBlockIndex()];
            blockInfo.kill.or(predInfo.out);
        }
        blockInfo.kill.andNot(blockInfo.in);
        // collect the results
        Collections.sort(blockNullers);
        nullableWithinBlock[i] = blockNullers;
        nullableBeforeBlock[i] = blockInfo.kill;
        nullableAfterBlock[i] = blockInfo.phiDefs;
    }
    return new LLVMLivenessAnalysisResult(nullableWithinBlock, nullableBeforeBlock, nullableAfterBlock);
}
Also used : ArrayList(java.util.ArrayList) BitSet(java.util.BitSet) Instruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.Instruction) CompareExchangeInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.CompareExchangeInstruction) TerminatingInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.TerminatingInstruction) BranchInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.BranchInstruction) LoadInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.LoadInstruction) InsertElementInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.InsertElementInstruction) DbgValueInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.DbgValueInstruction) DbgDeclareInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.DbgDeclareInstruction) ResumeInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.ResumeInstruction) ConditionalBranchInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.ConditionalBranchInstruction) CastInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.CastInstruction) ExtractValueInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.ExtractValueInstruction) StoreInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.StoreInstruction) SwitchInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.SwitchInstruction) ReadModifyWriteInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.ReadModifyWriteInstruction) SwitchOldInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.SwitchOldInstruction) CallInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.CallInstruction) VoidInvokeInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.VoidInvokeInstruction) CompareInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.CompareInstruction) BinaryOperationInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.BinaryOperationInstruction) GetElementPointerInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.GetElementPointerInstruction) PhiInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.PhiInstruction) FenceInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.FenceInstruction) SelectInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.SelectInstruction) AllocateInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.AllocateInstruction) VoidCallInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.VoidCallInstruction) LandingpadInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.LandingpadInstruction) ExtractElementInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.ExtractElementInstruction) UnreachableInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.UnreachableInstruction) ReturnInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.ReturnInstruction) ShuffleVectorInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.ShuffleVectorInstruction) IndirectBranchInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.IndirectBranchInstruction) InvokeInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.InvokeInstruction) InsertValueInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.InsertValueInstruction) PhiInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.PhiInstruction) InstructionBlock(com.oracle.truffle.llvm.parser.model.blocks.InstructionBlock) FunctionParameter(com.oracle.truffle.llvm.parser.model.functions.FunctionParameter)

Aggregations

InstructionBlock (com.oracle.truffle.llvm.parser.model.blocks.InstructionBlock)2 FunctionParameter (com.oracle.truffle.llvm.parser.model.functions.FunctionParameter)2 AllocateInstruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.AllocateInstruction)2 BinaryOperationInstruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.BinaryOperationInstruction)2 BranchInstruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.BranchInstruction)2 CallInstruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.CallInstruction)2 CastInstruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.CastInstruction)2 CompareExchangeInstruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.CompareExchangeInstruction)2 CompareInstruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.CompareInstruction)2 ConditionalBranchInstruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.ConditionalBranchInstruction)2 DbgDeclareInstruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.DbgDeclareInstruction)2 DbgValueInstruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.DbgValueInstruction)2 ExtractElementInstruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.ExtractElementInstruction)2 ExtractValueInstruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.ExtractValueInstruction)2 FenceInstruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.FenceInstruction)2 GetElementPointerInstruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.GetElementPointerInstruction)2 IndirectBranchInstruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.IndirectBranchInstruction)2 InsertElementInstruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.InsertElementInstruction)2 InsertValueInstruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.InsertValueInstruction)2 Instruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.Instruction)2