diff --git a/llvm/lib/Target/BPF/BPFISelLowering.cpp b/llvm/lib/Target/BPF/BPFISelLowering.cpp --- a/llvm/lib/Target/BPF/BPFISelLowering.cpp +++ b/llvm/lib/Target/BPF/BPFISelLowering.cpp @@ -368,7 +368,7 @@ HasMemArgs = true; else report_fatal_error("unhandled argument location"); - InVals.push_back(DAG.getConstant(0, DL, VA.getLocVT())); + InVals.push_back(DAG.getUNDEF(VA.getLocVT())); } } if (HasMemArgs) @@ -532,7 +532,7 @@ return DAG.getNode(Opc, DL, MVT::Other, Chain); } - // Analize return values. + // Analyze return values. CCInfo.AnalyzeReturn(Outs, getHasAlu32() ? RetCC_BPF32 : RetCC_BPF64); SDValue Glue; @@ -572,9 +572,9 @@ CCState CCInfo(CallConv, IsVarArg, MF, RVLocs, *DAG.getContext()); if (Ins.size() > 1) { - fail(DL, DAG, "only small returns supported"); + fail(DL, DAG, "only small returns are supported"); for (auto &In : Ins) - InVals.push_back(DAG.getConstant(0, DL, In.VT)); + InVals.push_back(DAG.getUNDEF(In.VT)); return DAG.getCopyFromReg(Chain, DL, 1, Ins[0].VT, InGlue).getValue(1); } diff --git a/llvm/test/CodeGen/BPF/struct_ret1.ll b/llvm/test/CodeGen/BPF/struct_ret1.ll --- a/llvm/test/CodeGen/BPF/struct_ret1.ll +++ b/llvm/test/CodeGen/BPF/struct_ret1.ll @@ -15,13 +15,3 @@ %.fca.1.insert = insertvalue { i64, i32 } %.fca.0.insert, i32 %retval.sroa.2.0.copyload, 1 ret { i64, i32 } %.fca.1.insert } - -; CHECK: error: :0:0: in function baz void (ptr): aggregate returns are not supported - -%struct.B = type { [100 x i64] } - -; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) -define dso_local void @baz(ptr noalias nocapture sret(%struct.B) align 8 %agg.result) local_unnamed_addr #0 { -entry: - ret void -} diff --git a/llvm/test/CodeGen/BPF/struct_ret2.ll b/llvm/test/CodeGen/BPF/struct_ret2.ll --- a/llvm/test/CodeGen/BPF/struct_ret2.ll +++ b/llvm/test/CodeGen/BPF/struct_ret2.ll @@ -1,6 +1,6 @@ ; RUN: not llc -march=bpf < %s 2> %t1 ; RUN: FileCheck %s < %t1 -; CHECK: only small returns +; CHECK: only small returns are supported ; Function Attrs: nounwind uwtable define { i64, i32 } @foo(i32 %a, i32 %b, i32 %c) #0 { diff --git a/llvm/test/CodeGen/BPF/struct_ret3.ll b/llvm/test/CodeGen/BPF/struct_ret3.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/BPF/struct_ret3.ll @@ -0,0 +1,11 @@ +; RUN: not llc -march=bpf < %s 2> %t1 +; RUN: FileCheck %s < %t1 +; CHECK: error: :0:0: in function baz void (ptr): aggregate returns are not supported + +%struct.B = type { [100 x i64] } + +; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) +define dso_local void @baz(ptr noalias nocapture sret(%struct.B) align 8 %agg.result) local_unnamed_addr #0 { +entry: + ret void +}