/// <summary cref="CompilerDeviceFunctions.MakeWarp(InvocationContext, WarpIntrinsicKind)"/>
        protected override Value?MakeWarp(InvocationContext context, WarpIntrinsicKind kind)
        {
            var          builder = context.Builder;
            LLVMValueRef value;

            switch (kind)
            {
            case WarpIntrinsicKind.WarpSize:
                value = MakeWarpSize(builder);
                break;

            case WarpIntrinsicKind.LaneIdx:
                value = BuildCall(builder, GetLaneId.Value);
                break;

            default:
                KeyValuePair <Lazy <LLVMValueRef>, bool> shuffleKey;
                if (!ShuffleLookup.TryGetValue(kind, out shuffleKey))
                {
                    throw context.CompilationContext.GetNotSupportedException(
                              ErrorMessages.NotSupportedWarpIntrinsic, kind);
                }
                // Create final mask
                var args = context.GetLLVMArgs();
                args[2] = BuildWarpShuffleMask(context.Unit, builder, args[2], shuffleKey.Value);
                // Build desired shuffle instruction
                value = BuildCall(builder, shuffleKey.Key.Value, args);
                break;
            }
            return(new Value(typeof(int), value));
        }
        /// <summary>
        /// Builds the actual invocation of the built-in assertion-failed method.
        /// </summary>
        /// <param name="context">The current invocation context.</param>
        /// <returns>Null.</returns>
        private Value?MakeAssertFailed(InvocationContext context)
        {
            var llvmContext = context.LLVMContext;
            var builder     = context.Builder;
            var args        = context.GetLLVMArgs();

            // Convert to void*
            var voidPtrType = llvmContext.VoidPtrType;

            args[0] = BuildBitCast(builder, args[0], voidPtrType, string.Empty);
            args[1] = BuildBitCast(builder, args[1], voidPtrType, string.Empty);
            args[3] = BuildBitCast(builder, args[3], voidPtrType, string.Empty);
            // Convert to size_t
            args[4] = BuildIntCast(builder, args[4], context.Unit.NativeIntPtrType, string.Empty);

            BuildCall(builder, AssertFailedMethod.Value, args);

            return(null);
        }