Make "aa[key]" use the same runtime call as "key in aa". The runtime calls

these were using were different, but with equivalent definitions.

With `ldc -O3`, the following functions now all compile to the exact same code:
{{{
int[int] y;
void foo(int x) {
    if (x in y) {
        auto z = x in y;
        sink(*z);
    }
}

void bar(int x) {
    if (x in y) {
        sink(y[x]);
    }
}

void baz(int x) {
    if (auto p = x in y) {
        sink(*p);
    }
}
}}}
This commit is contained in:
Frits van Bommel
2009-05-25 12:50:40 +02:00
parent c8665ddc88
commit e7b3f5415f
3 changed files with 13 additions and 57 deletions

View File

@@ -659,19 +659,6 @@ static void LLVM_D_BuildRuntimeModule()
->setAttributes(Attr_1_4_NoCapture);
}
// void* _aaGetRvalue(AA aa, TypeInfo keyti, size_t valuesize, void* pkey)
{
std::string fname("_aaGetRvalue");
std::vector<const LLType*> types;
types.push_back(aaTy);
types.push_back(typeInfoTy);
types.push_back(sizeTy);
types.push_back(voidPtrTy);
const llvm::FunctionType* fty = llvm::FunctionType::get(voidPtrTy, types, false);
llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)
->setAttributes(Attr_ReadOnly_1_4_NoCapture);
}
// void* _aaIn(AA aa, TypeInfo keyti, void* pkey)
{
std::string fname("_aaIn");