view ir/irvar.cpp @ 1275:bedf0bfb8fdb

Implement first D-specific optimization pass: -simplify-drtcalls. It uses the machinery of the standard -simplify-libcalls pass, but optimizes calls to the D runtime instead of calls to C libraries. At the moment, these optimizations are implemented by this pass: - Avoid the runtime call for `arr.length = newlen` if it can determine that the new length isn't longer than the old one. - Ditto for `cast(T[]) arr` if it will clearly always succeed. (e.g. if the length of the original array is zero, or if the old element size is a multiple of the new element size)
author Frits van Bommel <fvbommel wxs.nl>
date Tue, 28 Apr 2009 21:58:06 +0200
parents 212ec2d9d176
children 0c03ba6f7c24
line wrap: on
line source

#include "gen/llvm.h"
#include "declaration.h"
#include "ir/irvar.h"


//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

IrVar::IrVar(VarDeclaration* var)
{
    V = var;
    value = NULL;
}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

IrGlobal::IrGlobal(VarDeclaration* v): IrVar(v),
    type(llvm::OpaqueType::get())
{
    constInit = NULL;
}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

IrLocal::IrLocal(VarDeclaration* v) : IrVar(v)
{
    nestedIndex = -1;
}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

IrField::IrField(VarDeclaration* v, size_t idx, size_t offset) : IrVar(v)
{
    index = idx;
    unionOffset = offset;
    constInit = NULL;

    assert(V->ir.irField == NULL && "field for this variable already exists");
    V->ir.irField = this;
}

extern LLConstant* get_default_initializer(
    VarDeclaration* vd,
    Initializer* init);

llvm::Constant * IrField::getDefaultInit()
{
    if (constInit)
        return constInit;
    constInit = get_default_initializer(V, V->init);
    return constInit;
}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////