Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp @@ -146,14 +146,38 @@ // Nothing to do; jump tables are incorporated into the instruction stream. } +static void ComputeLegalValueVTs(const Function &F, + const TargetMachine &TM, + Type *Ty, + SmallVectorImpl &ValueVTs) { + const DataLayout& DL(F.getParent()->getDataLayout()); + const WebAssemblyTargetLowering &TLI = + *TM.getSubtarget(F).getTargetLowering(); + SmallVector VTs; + ComputeValueVTs(TLI, DL, Ty, VTs); + + for (EVT VT : VTs) { + unsigned NumRegs = TLI.getNumRegisters(F.getContext(), VT); + MVT RegisterVT = TLI.getRegisterType(F.getContext(), VT); + for (unsigned i = 0; i != NumRegs; ++i) + ValueVTs.push_back(RegisterVT); + } +} + void WebAssemblyAsmPrinter::EmitFunctionBodyStart() { SmallString<128> Str; raw_svector_ostream OS(Str); for (MVT VT : MFI->getParams()) OS << "\t" ".param " << toString(VT) << '\n'; - for (MVT VT : MFI->getResults()) - OS << "\t" ".result " << toString(VT) << '\n'; + + SmallVector ResultVTs; + const Function &F(*MF->getFunction()); + ComputeLegalValueVTs(F, TM, F.getReturnType(), ResultVTs); + // If the return type needs to be legalized it will get converted into + // passing a pointer. + if (ResultVTs.size() == 1) + OS << "\t" ".result " << toString(ResultVTs.front()) << '\n'; bool FirstVReg = true; for (unsigned Idx = 0, IdxE = MRI->getNumVirtRegs(); Idx != IdxE; ++Idx) { @@ -210,20 +234,7 @@ } } -static void ComputeLegalValueVTs(LLVMContext &Context, - const WebAssemblyTargetLowering &TLI, - const DataLayout &DL, Type *Ty, - SmallVectorImpl &ValueVTs) { - SmallVector VTs; - ComputeValueVTs(TLI, DL, Ty, VTs); - for (EVT VT : VTs) { - unsigned NumRegs = TLI.getNumRegisters(Context, VT); - MVT RegisterVT = TLI.getRegisterType(Context, VT); - for (unsigned i = 0; i != NumRegs; ++i) - ValueVTs.push_back(RegisterVT); - } -} void WebAssemblyAsmPrinter::EmitEndOfAsmFile(Module &M) { const DataLayout &DL = M.getDataLayout(); @@ -248,8 +259,7 @@ // passing a pointer. bool SawParam = false; SmallVector ResultVTs; - ComputeLegalValueVTs(M.getContext(), TLI, DL, F.getReturnType(), - ResultVTs); + ComputeLegalValueVTs(F, TM, F.getReturnType(), ResultVTs); if (ResultVTs.size() > 1) { ResultVTs.clear(); OS << " (param " << toString(TLI.getPointerTy(DL)); @@ -258,20 +268,20 @@ for (const Argument &A : F.args()) { SmallVector ParamVTs; - ComputeLegalValueVTs(M.getContext(), TLI, DL, A.getType(), ParamVTs); - for (EVT VT : ParamVTs) { + ComputeLegalValueVTs(F, TM, A.getType(), ParamVTs); + for (MVT VT : ParamVTs) { if (!SawParam) { OS << " (param"; SawParam = true; } - OS << ' ' << toString(VT.getSimpleVT()); + OS << ' ' << toString(VT); } } if (SawParam) OS << ')'; - for (EVT VT : ResultVTs) - OS << " (result " << toString(VT.getSimpleVT()) << ')'; + for (MVT VT : ResultVTs) + OS << " (result " << toString(VT) << ')'; OS << '\n'; } Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp @@ -326,8 +326,6 @@ const SmallVectorImpl &Outs, const SmallVectorImpl &OutVals, SDLoc DL, SelectionDAG &DAG) const { - MachineFunction &MF = DAG.getMachineFunction(); - assert(Outs.size() <= 1 && "WebAssembly can only return up to one value"); if (CallConv != CallingConv::C) fail(DL, DAG, "WebAssembly doesn't support non-C calling conventions"); @@ -352,7 +350,6 @@ fail(DL, DAG, "WebAssembly hasn't implemented cons regs last results"); if (!Out.IsFixed) fail(DL, DAG, "WebAssembly doesn't support non-fixed results yet"); - MF.getInfo()->addResult(Out.VT); } return Chain; Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.h =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.h +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.h @@ -28,7 +28,6 @@ MachineFunction &MF; std::vector Params; - std::vector Results; /// A mapping from CodeGen vreg index to WebAssembly register number. std::vector WARegs; @@ -48,9 +47,6 @@ void addParam(MVT VT) { Params.push_back(VT); } const std::vector &getParams() const { return Params; } - void addResult(MVT VT) { Results.push_back(VT); } - const std::vector &getResults() const { return Results; } - static const unsigned UnusedReg = -1u; void stackifyVReg(unsigned VReg) { Index: llvm/trunk/test/CodeGen/WebAssembly/func.ll =================================================================== --- llvm/trunk/test/CodeGen/WebAssembly/func.ll +++ llvm/trunk/test/CodeGen/WebAssembly/func.ll @@ -45,3 +45,24 @@ define void @f3(i32 %p1, float %p2) { ret void } + +; CHECK-LABEL: f4: +; CHECK-NEXT: .param i32{{$}} +; CHECK-NEXT: .result i32{{$}} +; CHECK-NEXT: .local +define i32 @f4(i32 %x) { +entry: + %c = trunc i32 %x to i1 + br i1 %c, label %true, label %false +true: + ret i32 0 +false: + ret i32 1 +} + +; CHECK-LABEL: f5: +; CHECK-NEXT: .result f32{{$}} +; CHECK-NEXT: unreachable +define float @f5() { + unreachable +}