Adapt to new array-append frontend lowerings

This commit is contained in:
Martin Kinkelin 2022-09-15 21:00:53 +02:00
parent fa8371558a
commit b81c2b5510
5 changed files with 4 additions and 78 deletions

View file

@ -37,15 +37,6 @@ LLValue *DtoSlice(LLValue *ptr, LLValue *length, LLType *elemType) {
elemType = i1ToI8(voidToI8(elemType)); elemType = i1ToI8(voidToI8(elemType));
return DtoAggrPair(length, DtoBitCast(ptr, elemType->getPointerTo())); return DtoAggrPair(length, DtoBitCast(ptr, elemType->getPointerTo()));
} }
LLValue *DtoSlice(Expression *e) {
DValue *dval = toElem(e);
if (dval->type->toBasetype()->ty == TY::Tsarray) {
// Convert static array to slice
return DtoSlice(DtoLVal(dval), DtoArrayLen(dval), DtoType(dval->type->nextOf()));
}
return DtoRVal(dval);
}
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -787,57 +778,6 @@ DSliceValue *DtoResizeDynArray(const Loc &loc, Type *arrayType, DValue *array,
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void DtoCatAssignElement(const Loc &loc, DValue *array, Expression *exp) {
IF_LOG Logger::println("DtoCatAssignElement");
LOG_SCOPE;
assert(array);
Type *arrayType = array->type->toBasetype();
// Evaluate the expression to be appended first; it may affect the array.
DValue *expVal = toElem(exp);
// The druntime function extends the slice in-place (length += 1, ptr
// potentially moved to a new block).
LLFunction *fn = getRuntimeFunction(loc, gIR->module, "_d_arrayappendcTX");
gIR->CreateCallOrInvoke(
fn, DtoTypeInfoOf(loc, arrayType),
DtoBitCast(DtoLVal(array), fn->getFunctionType()->getParamType(1)),
DtoConstSize_t(1), ".appendedArray");
// Assign to the new last element.
LLValue *newLength = DtoArrayLen(array);
LLValue *ptr = DtoArrayPtr(array);
LLType *ptrty = i1ToI8(DtoType(array->type->nextOf()));
LLValue *lastIndex =
gIR->ir->CreateSub(newLength, DtoConstSize_t(1), ".lastIndex");
LLValue *lastElemPtr = DtoGEP1(ptrty, ptr, lastIndex, ".lastElem");
DLValue lastElem(arrayType->nextOf(), lastElemPtr);
DtoAssign(loc, &lastElem, expVal, EXP::blit);
callPostblit(loc, exp, lastElemPtr);
}
////////////////////////////////////////////////////////////////////////////////
DSliceValue *DtoCatAssignArray(const Loc &loc, DValue *arr, Expression *exp) {
IF_LOG Logger::println("DtoCatAssignArray");
LOG_SCOPE;
Type *arrayType = arr->type;
LLFunction *fn = getRuntimeFunction(loc, gIR->module, "_d_arrayappendT");
// Call _d_arrayappendT(TypeInfo ti, byte[] *px, byte[] y)
LLValue *newArray = gIR->CreateCallOrInvoke(
fn, DtoTypeInfoOf(loc, arrayType),
DtoBitCast(DtoLVal(arr), fn->getFunctionType()->getParamType(1)),
DtoSlicePaint(DtoSlice(exp), fn->getFunctionType()->getParamType(2)),
".appendedArray");
return getSlice(arrayType, newArray);
}
////////////////////////////////////////////////////////////////////////////////
static LLValue *DtoSlicePtr(DValue *dval) { static LLValue *DtoSlicePtr(DValue *dval) {
Loc loc; Loc loc;
Type *vt = dval->type->toBasetype(); Type *vt = dval->type->toBasetype();
@ -868,7 +808,7 @@ static LLValue *DtoSlicePtr(Expression *e) {
DSliceValue *DtoCatArrays(const Loc &loc, Type *arrayType, Expression *exp1, DSliceValue *DtoCatArrays(const Loc &loc, Type *arrayType, Expression *exp1,
Expression *exp2) { Expression *exp2) {
IF_LOG Logger::println("DtoCatAssignArray"); IF_LOG Logger::println("DtoCatArrays");
LOG_SCOPE; LOG_SCOPE;
llvm::SmallVector<llvm::Value *, 3> args; llvm::SmallVector<llvm::Value *, 3> args;

View file

@ -67,8 +67,6 @@ DSliceValue *DtoNewMulDimDynArray(const Loc &loc, Type *arrayType,
DSliceValue *DtoResizeDynArray(const Loc &loc, Type *arrayType, DValue *array, DSliceValue *DtoResizeDynArray(const Loc &loc, Type *arrayType, DValue *array,
llvm::Value *newdim); llvm::Value *newdim);
void DtoCatAssignElement(const Loc &loc, DValue *arr, Expression *exp);
DSliceValue *DtoCatAssignArray(const Loc &loc, DValue *arr, Expression *exp);
DSliceValue *DtoCatArrays(const Loc &loc, Type *type, Expression *e1, DSliceValue *DtoCatArrays(const Loc &loc, Type *type, Expression *e1,
Expression *e2); Expression *e2);
DSliceValue *DtoAppendDCharToString(const Loc &loc, DValue *arr, DSliceValue *DtoAppendDCharToString(const Loc &loc, DValue *arr,

View file

@ -590,14 +590,6 @@ static void buildRuntimeModule() {
{"_d_arraysetlengthT", "_d_arraysetlengthiT"}, {"_d_arraysetlengthT", "_d_arraysetlengthiT"},
{typeInfoTy, sizeTy, voidArrayPtrTy}, {STCconst, 0, 0}); {typeInfoTy, sizeTy, voidArrayPtrTy}, {STCconst, 0, 0});
// byte[] _d_arrayappendcTX(const TypeInfo ti, ref byte[] px, size_t n)
createFwdDecl(LINK::c, voidArrayTy, {"_d_arrayappendcTX"},
{typeInfoTy, voidArrayTy, sizeTy}, {STCconst, STCref, 0});
// void[] _d_arrayappendT(const TypeInfo ti, ref byte[] x, byte[] y)
createFwdDecl(LINK::c, voidArrayTy, {"_d_arrayappendT"},
{typeInfoTy, voidArrayTy, voidArrayTy}, {STCconst, STCref, 0});
// void[] _d_arrayappendcd(ref byte[] x, dchar c) // void[] _d_arrayappendcd(ref byte[] x, dchar c)
// void[] _d_arrayappendwd(ref byte[] x, dchar c) // void[] _d_arrayappendwd(ref byte[] x, dchar c)
createFwdDecl(LINK::c, voidArrayTy, {"_d_arrayappendcd", "_d_arrayappendwd"}, createFwdDecl(LINK::c, voidArrayTy, {"_d_arrayappendcd", "_d_arrayappendwd"},

View file

@ -2174,13 +2174,9 @@ public:
// append dchar to wchar[] // append dchar to wchar[]
DtoAppendDCharToUnicodeString(e->loc, result, e->e2); DtoAppendDCharToUnicodeString(e->loc, result, e->e2);
} }
} else if (e1type->equals(e2type)) {
// append array
DSliceValue *slice = DtoCatAssignArray(e->loc, result, e->e2);
DtoStore(DtoRVal(slice), DtoLVal(result));
} else { } else {
// append element e->error("ICE: array append should have been lowered to `_d_arrayappend{T,cTX}`!");
DtoCatAssignElement(e->loc, result, e->e2); fatal();
} }
} }

View file

@ -31,7 +31,7 @@ void func()
int[] quux; int[] quux;
//CHECK: dcompute.d([[@LINE+1]]): Error: can only call functions from other `@compute` modules in `@compute` code //CHECK: dcompute.d([[@LINE+1]]): Error: can only call functions from other `@compute` modules in `@compute` code
quux.length = 1; quux.length = 1;
//CHECK: dcompute.d([[@LINE+1]]): Error: cannot use operator `~=` in `@compute` code //CHECK: dcompute.d([[@LINE+1]]): Error: can only call functions from other `@compute` modules in `@compute` code
quux ~= 42; quux ~= 42;
//CHECK: dcompute.d([[@LINE+1]]): Error: cannot use operator `~` in `@compute` code //CHECK: dcompute.d([[@LINE+1]]): Error: cannot use operator `~` in `@compute` code
cast(void) (quux ~ 1); cast(void) (quux ~ 1);