Rework inlining logic (#463)

This commit is contained in:
Daniel Wirtz
2019-02-06 23:42:43 +01:00
committed by GitHub
parent 01cade13f9
commit 831054dfd3
40 changed files with 14369 additions and 9544 deletions

View File

@ -154,7 +154,7 @@ export function compileCall(
}
let element = compiler.resolver.resolveExpression(
operands[0],
compiler.currentFunction,
compiler.currentFlow,
Type.void,
ReportMode.SWALLOW
);
@ -639,11 +639,11 @@ export function compileCall(
case TypeKind.I8:
case TypeKind.I16:
case TypeKind.I32: {
let currentFunction = compiler.currentFunction;
let flow = compiler.currentFlow;
// possibly overflows, e.g. abs<i8>(-128) == 128
let tempLocal1 = currentFunction.getTempLocal(Type.i32, false);
let tempLocalIndex2 = currentFunction.getAndFreeTempLocal(Type.i32, false).index;
let tempLocal1 = flow.getTempLocal(Type.i32, false);
let tempLocalIndex2 = flow.getAndFreeTempLocal(Type.i32, false).index;
let tempLocalIndex1 = tempLocal1.index;
// (x + (x >> 31)) ^ (x >> 31)
@ -661,16 +661,16 @@ export function compileCall(
module.createGetLocal(tempLocalIndex2, NativeType.I32)
);
currentFunction.freeTempLocal(tempLocal1);
flow.freeTempLocal(tempLocal1);
break;
}
case TypeKind.ISIZE: {
let options = compiler.options;
let currentFunction = compiler.currentFunction;
let flow = compiler.currentFlow;
let wasm64 = options.isWasm64;
let tempLocal1 = currentFunction.getTempLocal(options.usizeType, false);
let tempLocalIndex2 = currentFunction.getAndFreeTempLocal(options.usizeType, false).index;
let tempLocal1 = flow.getTempLocal(options.usizeType, false);
let tempLocalIndex2 = flow.getAndFreeTempLocal(options.usizeType, false).index;
let tempLocalIndex1 = tempLocal1.index;
ret = module.createBinary(wasm64 ? BinaryOp.XorI64 : BinaryOp.XorI32,
@ -687,14 +687,14 @@ export function compileCall(
module.createGetLocal(tempLocalIndex2, options.nativeSizeType)
);
currentFunction.freeTempLocal(tempLocal1);
flow.freeTempLocal(tempLocal1);
break;
}
case TypeKind.I64: {
let currentFunction = compiler.currentFunction;
let flow = compiler.currentFlow;
let tempLocal1 = currentFunction.getTempLocal(Type.i64, false);
let tempLocalIndex2 = currentFunction.getAndFreeTempLocal(Type.i64, false).index;
let tempLocal1 = flow.getTempLocal(Type.i64, false);
let tempLocalIndex2 = flow.getAndFreeTempLocal(Type.i64, false).index;
let tempLocalIndex1 = tempLocal1.index;
// (x + (x >> 63)) ^ (x >> 63)
@ -712,7 +712,7 @@ export function compileCall(
module.createGetLocal(tempLocalIndex2, NativeType.I64)
);
currentFunction.freeTempLocal(tempLocal1);
flow.freeTempLocal(tempLocal1);
break;
}
case TypeKind.USIZE: {
@ -792,16 +792,16 @@ export function compileCall(
case TypeKind.I8:
case TypeKind.I16:
case TypeKind.I32: {
let flow = compiler.currentFunction.flow;
let tempLocal0 = compiler.currentFunction.getTempLocal(
let flow = compiler.currentFlow;
let tempLocal0 = flow.getTempLocal(
compiler.currentType,
!flow.canOverflow(arg0, compiler.currentType)
);
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(
let tempLocal1 = flow.getAndFreeTempLocal(
compiler.currentType,
!flow.canOverflow(arg1, compiler.currentType)
);
compiler.currentFunction.freeTempLocal(tempLocal0);
flow.freeTempLocal(tempLocal0);
ret = module.createSelect(
module.createTeeLocal(tempLocal0.index, arg0),
module.createTeeLocal(tempLocal1.index, arg1),
@ -816,16 +816,16 @@ export function compileCall(
case TypeKind.U16:
case TypeKind.U32:
case TypeKind.BOOL: {
let flow = compiler.currentFunction.flow;
let tempLocal0 = compiler.currentFunction.getTempLocal(
let flow = compiler.currentFlow;
let tempLocal0 = flow.getTempLocal(
compiler.currentType,
!flow.canOverflow(arg0, compiler.currentType)
);
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(
let tempLocal1 = flow.getAndFreeTempLocal(
compiler.currentType,
!flow.canOverflow(arg1, compiler.currentType)
);
compiler.currentFunction.freeTempLocal(tempLocal0);
flow.freeTempLocal(tempLocal0);
ret = module.createSelect(
module.createTeeLocal(tempLocal0.index, arg0),
module.createTeeLocal(tempLocal1.index, arg1),
@ -837,9 +837,10 @@ export function compileCall(
break;
}
case TypeKind.I64: {
let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);
compiler.currentFunction.freeTempLocal(tempLocal0);
let flow = compiler.currentFlow;
let tempLocal0 = flow.getTempLocal(Type.i64, false);
let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);
flow.freeTempLocal(tempLocal0);
ret = module.createSelect(
module.createTeeLocal(tempLocal0.index, arg0),
module.createTeeLocal(tempLocal1.index, arg1),
@ -851,9 +852,10 @@ export function compileCall(
break;
}
case TypeKind.U64: {
let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);
compiler.currentFunction.freeTempLocal(tempLocal0);
let flow = compiler.currentFlow;
let tempLocal0 = flow.getTempLocal(Type.i64, false);
let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);
flow.freeTempLocal(tempLocal0);
ret = module.createSelect(
module.createTeeLocal(tempLocal0.index, arg0),
module.createTeeLocal(tempLocal1.index, arg1),
@ -865,9 +867,10 @@ export function compileCall(
break;
}
case TypeKind.ISIZE: {
let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);
compiler.currentFunction.freeTempLocal(tempLocal0);
let flow = compiler.currentFlow;
let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);
let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);
flow.freeTempLocal(tempLocal0);
ret = module.createSelect(
module.createTeeLocal(tempLocal0.index, arg0),
module.createTeeLocal(tempLocal1.index, arg1),
@ -890,9 +893,10 @@ export function compileCall(
ret = module.createUnreachable();
break;
}
let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);
compiler.currentFunction.freeTempLocal(tempLocal0);
let flow = compiler.currentFlow;
let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);
let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);
flow.freeTempLocal(tempLocal0);
ret = module.createSelect(
module.createTeeLocal(tempLocal0.index, arg0),
module.createTeeLocal(tempLocal1.index, arg1),
@ -960,16 +964,16 @@ export function compileCall(
case TypeKind.I8:
case TypeKind.I16:
case TypeKind.I32: {
let flow = compiler.currentFunction.flow;
let tempLocal0 = compiler.currentFunction.getTempLocal(
let flow = compiler.currentFlow;
let tempLocal0 = flow.getTempLocal(
compiler.currentType,
!flow.canOverflow(arg0, compiler.currentType)
);
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(
let tempLocal1 = flow.getAndFreeTempLocal(
compiler.currentType,
!flow.canOverflow(arg1, compiler.currentType)
);
compiler.currentFunction.freeTempLocal(tempLocal0);
flow.freeTempLocal(tempLocal0);
ret = module.createSelect(
module.createTeeLocal(tempLocal0.index, arg0),
module.createTeeLocal(tempLocal1.index, arg1),
@ -984,16 +988,16 @@ export function compileCall(
case TypeKind.U16:
case TypeKind.U32:
case TypeKind.BOOL: {
let flow = compiler.currentFunction.flow;
let tempLocal0 = compiler.currentFunction.getTempLocal(
let flow = compiler.currentFlow;
let tempLocal0 = flow.getTempLocal(
compiler.currentType,
!flow.canOverflow(arg0, compiler.currentType)
);
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(
let tempLocal1 = flow.getAndFreeTempLocal(
compiler.currentType,
!flow.canOverflow(arg1, compiler.currentType)
);
compiler.currentFunction.freeTempLocal(tempLocal0);
flow.freeTempLocal(tempLocal0);
ret = module.createSelect(
module.createTeeLocal(tempLocal0.index, arg0),
module.createTeeLocal(tempLocal1.index, arg1),
@ -1005,9 +1009,10 @@ export function compileCall(
break;
}
case TypeKind.I64: {
let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);
compiler.currentFunction.freeTempLocal(tempLocal0);
let flow = compiler.currentFlow;
let tempLocal0 = flow.getTempLocal(Type.i64, false);
let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);
flow.freeTempLocal(tempLocal0);
ret = module.createSelect(
module.createTeeLocal(tempLocal0.index, arg0),
module.createTeeLocal(tempLocal1.index, arg1),
@ -1019,9 +1024,10 @@ export function compileCall(
break;
}
case TypeKind.U64: {
let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);
compiler.currentFunction.freeTempLocal(tempLocal0);
let flow = compiler.currentFlow;
let tempLocal0 = flow.getTempLocal(Type.i64, false);
let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);
flow.freeTempLocal(tempLocal0);
ret = module.createSelect(
module.createTeeLocal(tempLocal0.index, arg0),
module.createTeeLocal(tempLocal1.index, arg1),
@ -1033,9 +1039,10 @@ export function compileCall(
break;
}
case TypeKind.ISIZE: {
let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);
compiler.currentFunction.freeTempLocal(tempLocal0);
let flow = compiler.currentFlow;
let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);
let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);
flow.freeTempLocal(tempLocal0);
ret = module.createSelect(
module.createTeeLocal(tempLocal0.index, arg0),
module.createTeeLocal(tempLocal1.index, arg1),
@ -1058,9 +1065,10 @@ export function compileCall(
ret = module.createUnreachable();
break;
}
let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);
compiler.currentFunction.freeTempLocal(tempLocal0);
let flow = compiler.currentFlow;
let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);
let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);
flow.freeTempLocal(tempLocal0);
ret = module.createSelect(
module.createTeeLocal(tempLocal0.index, arg0),
module.createTeeLocal(tempLocal1.index, arg1),
@ -2186,8 +2194,8 @@ export function compileCall(
case TypeKind.U8:
case TypeKind.U16:
case TypeKind.BOOL: {
let flow = compiler.currentFunction.flow;
let tempLocal = compiler.currentFunction.getAndFreeTempLocal(
let flow = compiler.currentFlow;
let tempLocal = flow.getAndFreeTempLocal(
compiler.currentType,
!flow.canOverflow(arg0, compiler.currentType)
);
@ -2201,7 +2209,7 @@ export function compileCall(
case TypeKind.I32:
case TypeKind.U32:
default: {
let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);
let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.i32, false);
ret = module.createIf(
module.createTeeLocal(tempLocal.index, arg0),
module.createGetLocal(tempLocal.index, NativeType.I32),
@ -2211,7 +2219,7 @@ export function compileCall(
}
case TypeKind.I64:
case TypeKind.U64: {
let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);
let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.i64, false);
ret = module.createIf(
module.createUnary(UnaryOp.EqzI64,
module.createTeeLocal(tempLocal.index, arg0)
@ -2223,7 +2231,7 @@ export function compileCall(
}
case TypeKind.ISIZE:
case TypeKind.USIZE: {
let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);
let tempLocal = compiler.currentFlow.getAndFreeTempLocal(compiler.options.usizeType, false);
ret = module.createIf(
module.createUnary(
compiler.options.isWasm64
@ -2237,7 +2245,7 @@ export function compileCall(
break;
}
case TypeKind.F32: {
let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.f32, false);
let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.f32, false);
ret = module.createIf(
module.createBinary(BinaryOp.EqF32,
module.createTeeLocal(tempLocal.index, arg0),
@ -2249,7 +2257,7 @@ export function compileCall(
break;
}
case TypeKind.F64: {
let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.f64, false);
let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.f64, false);
ret = module.createIf(
module.createBinary(BinaryOp.EqF64,
module.createTeeLocal(tempLocal.index, arg0),
@ -2286,7 +2294,7 @@ export function compileCall(
);
return module.createUnreachable();
}
let flow = compiler.currentFunction.flow;
let flow = compiler.currentFlow;
flow.set(FlowFlags.UNCHECKED_CONTEXT);
ret = compiler.compileExpressionRetainType(operands[0], contextualType, WrapMode.NONE);
flow.unset(FlowFlags.UNCHECKED_CONTEXT);