Index: llvm/trunk/lib/Target/NVPTX/NVPTXISelLowering.cpp =================================================================== --- llvm/trunk/lib/Target/NVPTX/NVPTXISelLowering.cpp +++ llvm/trunk/lib/Target/NVPTX/NVPTXISelLowering.cpp @@ -1661,7 +1661,12 @@ } } - if (!Func) { + // Both indirect calls and libcalls have nullptr Func. In order to distinguish + // between them we must rely on the call site value which is valid for + // indirect calls but is always null for libcalls. + bool isIndirectCall = !Func && CS; + + if (isIndirectCall) { // This is indirect function call case : PTX requires a prototype of the // form // proto_0 : .callprototype(.param .b32 _) _ (.param .b32 _); @@ -1685,7 +1690,7 @@ Chain, DAG.getConstant((Ins.size() == 0) ? 0 : 1, dl, MVT::i32), InFlag }; // We model convergent calls as separate opcodes. - unsigned Opcode = Func ? NVPTXISD::PrintCallUni : NVPTXISD::PrintCall; + unsigned Opcode = isIndirectCall ? NVPTXISD::PrintCall : NVPTXISD::PrintCallUni; if (CLI.IsConvergent) Opcode = Opcode == NVPTXISD::PrintCallUni ? NVPTXISD::PrintConvergentCallUni : NVPTXISD::PrintConvergentCall; @@ -1719,12 +1724,12 @@ } SDVTList CallArgEndVTs = DAG.getVTList(MVT::Other, MVT::Glue); SDValue CallArgEndOps[] = { Chain, - DAG.getConstant(Func ? 1 : 0, dl, MVT::i32), + DAG.getConstant(isIndirectCall ? 0 : 1, dl, MVT::i32), InFlag }; Chain = DAG.getNode(NVPTXISD::CallArgEnd, dl, CallArgEndVTs, CallArgEndOps); InFlag = Chain.getValue(1); - if (!Func) { + if (isIndirectCall) { SDVTList PrototypeVTs = DAG.getVTList(MVT::Other, MVT::Glue); SDValue PrototypeOps[] = { Chain, DAG.getConstant(uniqueCallSite, dl, MVT::i32), Index: llvm/trunk/test/CodeGen/NVPTX/libcall-instruction.ll =================================================================== --- llvm/trunk/test/CodeGen/NVPTX/libcall-instruction.ll +++ llvm/trunk/test/CodeGen/NVPTX/libcall-instruction.ll @@ -0,0 +1,8 @@ +; RUN: not llc < %s -march=nvptx 2>&1 | FileCheck %s +; used to panic on failed assetion and now fails with a "Cannot select" + +; CHECK: LLVM ERROR: Cannot select: {{t28|0x[0-9a-f]+}}: i32 = ExternalSymbol'__umodti3' +define hidden i128 @remainder(i128, i128) { + %3 = urem i128 %0, %1 + ret i128 %3 +}