/// <summary> /// Loads a variable. This can be an argument or a local reference. /// </summary> /// <param name="block">The current basic block.</param> /// <param name="builder">The current builder.</param> /// <param name="var">The variable reference.</param> private void LoadVariable( Block block, IRBuilder builder, VariableRef var) { Debug.Assert( var.RefType == VariableRefType.Argument || var.RefType == VariableRefType.Local); var addressOrValue = block.GetValue(var); if (variables.Contains(var)) { var type = variableTypes[var]; block.Push(CreateLoad( builder, addressOrValue, type.Item1, type.Item2)); } else { block.Push(addressOrValue); } }
public override BasicBlock code() { block = bb(); IRBuilder builder = new IRBuilder(block); LLVM.Type[] argTypes = new LLVM.Type[] { Parser.i8p, Parser.dblp, Parser.i8 }; FunctionType stringToInt = new FunctionType(Parser.vd, argTypes); Constant writeArrayToFile = Parser.module.GetOrInsertFunction("writeArrayToFile", stringToInt); Value arrayPointer = Parser.variables.arrayItem(builder, arrayName, Parser.zero); Value fileNamePointer = fileName.code(builder); Value arraySize = Parser.variables.arraySizes[arrayName]; Value arrayPointer2 = builder.CreateGEP(arrayPointer, Parser.zero, "arrayGEP"); Value[] args = { fileNamePointer, arrayPointer2, arraySize }; builder.CreateCall(writeArrayToFile, args); return(block); }
/// <summary> /// Synthesizes instructions that compute a CUDA thread's unique ID. /// </summary> /// <param name="builder">An instruction builder.</param> /// <param name="module">An LLVM module to modify.</param> /// <returns>An instruction that generates a unique thread ID.</returns> private static LLVMValueRef ComputeUniqueThreadId(IRBuilder builder, LLVMModuleRef module) { // Aggregate thread, block IDs into a single unique identifier. // The way we do this is by iteratively applying this operation: // // y * nx + x, // // where 'x' is a "row" index, 'nx' is the number of "rows" and 'y' is // a "column" index. var ids = new[] { "tid.x", "tid.y", "tid.z", "ctaid.x", "ctaid.y", "ctaid.z" }; var accumulator = ReadSReg(ids[ids.Length - 1], builder, module); for (int i = ids.Length - 2; i >= 0; i--) { accumulator = builder.CreateAdd( builder.CreateMul( accumulator, ReadSReg("n" + ids[i], builder, module), ""), ReadSReg(ids[i], builder, module), ""); } return(accumulator); }
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => builder.CreateShuffle( rebuilder.Rebuild(Variable), rebuilder.Rebuild(Origin), rebuilder.Rebuild(Width), Kind);
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => builder.CreateBarrier(Kind);
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => builder.CreateAtomicCAS( rebuilder.Rebuild(Target), rebuilder.Rebuild(Value), rebuilder.Rebuild(CompareValue), Flags);
public AsyncStateGroupCompilerState(LLVMValueRef function, IRBuilder builder) : base(function, builder) { }
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => builder.CreateGetViewLength( rebuilder.Rebuild(View));
public virtual Value code(IRBuilder builder) { // abstract throw new CompileException("Can't code RelationalExpression directly"); }
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => builder.CreateArithmetic( rebuilder.Rebuild(Value), Kind, Flags);
/// <summary> /// Rebuilds the current value in the scope of the given rebuilder. /// </summary> /// <param name="builder">The builder to use.</param> /// <param name="rebuilder">The rebuilder to use.</param> /// <returns>The rebuilt value.</returns> protected internal abstract Value Rebuild(IRBuilder builder, IRRebuilder rebuilder);
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => builder.CreateLaneIdxValue();
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => builder.CreateWarpSizeValue();
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => builder.CreateGroupDimensionValue(Dimension);
public Value Seal() => IRBuilder.FinishLoadArrayElementAddress(Location, ref builder);
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => builder.CreateNull(Type);
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => builder.CreateCompare( rebuilder.Rebuild(Left), rebuilder.Rebuild(Right), Kind, Flags);
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => builder.CreateReturn( rebuilder.Rebuild(ReturnValue));
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => builder.CreateNewView( rebuilder.Rebuild(Pointer), rebuilder.Rebuild(Length));
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => builder.CreateUnconditionalBranch( rebuilder.LookupTarget(Target));
protected FunctionCompilerState(LLVMValueRef function, IRBuilder builder) { Function = function; Builder = builder; }
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => builder.CreateConditionalBranch( rebuilder.Rebuild(Condition), rebuilder.LookupTarget(TrueTarget), rebuilder.LookupTarget(FalseTarget));
public OuterFunctionCompilerState(LLVMValueRef function, IRBuilder builder) : base(function, builder) { }
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => throw new InvalidOperationException();
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) { // Params have already been mapped in the beginning return(rebuilder.Rebuild(this)); }
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => builder.CreatePrimitiveValue(BasicValueType, rawValue);
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => builder.CreateBroadcast( rebuilder.Rebuild(Variable), rebuilder.Rebuild(Origin), Kind);
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => builder.CreatePrimitiveValue(String);
public NewArray Seal() => IRBuilder.FinishNewArray(Location, ArrayType, ref builder);
/// <summary cref="Value.Rebuild(IRBuilder, IRRebuilder)"/> protected internal override Value Rebuild(IRBuilder builder, IRRebuilder rebuilder) => builder.CreateSizeOf(TargetType);