Search in sources :

Example 1 with Instruction

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

the class FunctionDefinition method exitLocalScope.

public void exitLocalScope() {
    int symbolIndex = 0;
    // in K&R style function declarations the parameters are not assigned names
    for (final FunctionParameter parameter : parameters) {
        if (LLVMIdentifier.UNKNOWN.equals(parameter.getName())) {
            parameter.setName(String.valueOf(symbolIndex++));
        }
    }
    final Set<String> explicitBlockNames = Arrays.stream(blocks).map(InstructionBlock::getName).filter(blockName -> !LLVMIdentifier.UNKNOWN.equals(blockName)).collect(Collectors.toSet());
    for (final InstructionBlock block : blocks) {
        if (block.getName().equals(LLVMIdentifier.UNKNOWN)) {
            do {
                block.setName(LLVMIdentifier.toImplicitBlockName(symbolIndex++));
            // avoid name clashes
            } while (explicitBlockNames.contains(block.getName()));
        }
        for (int i = 0; i < block.getInstructionCount(); i++) {
            final Instruction instruction = block.getInstruction(i);
            if (instruction instanceof ValueInstruction) {
                final ValueInstruction value = (ValueInstruction) instruction;
                if (value.getName().equals(LLVMIdentifier.UNKNOWN)) {
                    value.setName(String.valueOf(symbolIndex++));
                }
            }
        }
    }
}
Also used : Instruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.Instruction) Arrays(java.util.Arrays) MetadataAttachmentHolder(com.oracle.truffle.llvm.parser.metadata.MetadataAttachmentHolder) ValueSymbol(com.oracle.truffle.llvm.parser.model.ValueSymbol) SymbolVisitor(com.oracle.truffle.llvm.parser.model.visitors.SymbolVisitor) Linkage(com.oracle.truffle.llvm.parser.model.enums.Linkage) LLVMIdentifier(com.oracle.truffle.llvm.runtime.types.symbols.LLVMIdentifier) ArrayList(java.util.ArrayList) DebugInfoModuleProcessor(com.oracle.truffle.llvm.parser.metadata.debuginfo.DebugInfoModuleProcessor) Type(com.oracle.truffle.llvm.runtime.types.Type) SourceSection(com.oracle.truffle.api.source.SourceSection) MDAttachment(com.oracle.truffle.llvm.parser.metadata.MDAttachment) Constant(com.oracle.truffle.llvm.parser.model.symbols.constants.Constant) CompilerAsserts(com.oracle.truffle.api.CompilerAsserts) AttributesGroup(com.oracle.truffle.llvm.parser.model.attributes.AttributesGroup) ValueInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.ValueInstruction) Set(java.util.Set) SymbolImpl(com.oracle.truffle.llvm.parser.model.SymbolImpl) InstructionBlock(com.oracle.truffle.llvm.parser.model.blocks.InstructionBlock) AttributesCodeEntry(com.oracle.truffle.llvm.parser.model.attributes.AttributesCodeEntry) Collectors(java.util.stream.Collectors) List(java.util.List) FunctionType(com.oracle.truffle.llvm.runtime.types.FunctionType) LLVMSourceLocation(com.oracle.truffle.llvm.runtime.debug.scope.LLVMSourceLocation) SourceFunction(com.oracle.truffle.llvm.parser.metadata.debuginfo.SourceFunction) FunctionVisitor(com.oracle.truffle.llvm.parser.model.visitors.FunctionVisitor) ValueInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.ValueInstruction) InstructionBlock(com.oracle.truffle.llvm.parser.model.blocks.InstructionBlock) Instruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.Instruction) ValueInstruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.ValueInstruction)

Example 2 with Instruction

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

the class LLVMBitcodeFunctionVisitor method visit.

@Override
public void visit(InstructionBlock block) {
    List<Phi> blockPhis = phis.get(block);
    ArrayList<LLVMLivenessAnalysis.NullerInformation> blockNullerInfos = liveness.getNullableWithinBlock()[block.getBlockIndex()];
    LLVMBitcodeInstructionVisitor visitor = new LLVMBitcodeInstructionVisitor(frame, blockPhis, nodeFactory, argCount, symbols, runtime, blockNullerInfos, function.getSourceFunction(), notNullable, dbgInfoHandler);
    if (initDebugValues) {
        for (SourceVariable variable : function.getSourceFunction().getVariables()) {
            final LLVMExpressionNode initNode = dbgInfoHandler.createInitializer(variable);
            if (initNode != null) {
                visitor.addInstructionUnchecked(initNode);
            }
        }
        initDebugValues = false;
    }
    for (int i = 0; i < block.getInstructionCount(); i++) {
        Instruction instruction = block.getInstruction(i);
        visitor.setInstructionIndex(i);
        instruction.accept(visitor);
    }
    blocks.add(nodeFactory.createBasicBlockNode(runtime, visitor.getInstructions(), visitor.getControlFlowNode(), block.getBlockIndex(), block.getName()));
}
Also used : Phi(com.oracle.truffle.llvm.parser.LLVMPhiManager.Phi) SourceVariable(com.oracle.truffle.llvm.parser.metadata.debuginfo.SourceVariable) LLVMExpressionNode(com.oracle.truffle.llvm.runtime.nodes.api.LLVMExpressionNode) Instruction(com.oracle.truffle.llvm.parser.model.symbols.instructions.Instruction)

Example 3 with Instruction

use of com.oracle.truffle.llvm.parser.model.symbols.instructions.Instruction 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 4 with Instruction

use of com.oracle.truffle.llvm.parser.model.symbols.instructions.Instruction 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

Instruction (com.oracle.truffle.llvm.parser.model.symbols.instructions.Instruction)4 InstructionBlock (com.oracle.truffle.llvm.parser.model.blocks.InstructionBlock)3 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