diff --git a/llvm/lib/Target/VE/VEISelLowering.cpp b/llvm/lib/Target/VE/VEISelLowering.cpp --- a/llvm/lib/Target/VE/VEISelLowering.cpp +++ b/llvm/lib/Target/VE/VEISelLowering.cpp @@ -135,6 +135,10 @@ /// Stack { setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i32, Custom); setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i64, Custom); + + // Use the default implementation. + setOperationAction(ISD::STACKSAVE, MVT::Other, Expand); + setOperationAction(ISD::STACKRESTORE, MVT::Other, Expand); /// } Stack /// Branch { diff --git a/llvm/test/CodeGen/VE/Scalar/stacksave.ll b/llvm/test/CodeGen/VE/Scalar/stacksave.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/VE/Scalar/stacksave.ll @@ -0,0 +1,26 @@ +; RUN: llc < %s -mtriple=ve | FileCheck %s + +; Function Attrs: noinline nounwind optnone +define i8* @stacksave() { +; CHECK-LABEL: stacksave: +; CHECK: .LBB{{[0-9]+}}_2: +; CHECK-NEXT: or %s0, 0, %s11 +; CHECK-NEXT: or %s11, 0, %s9 + %ret = call i8* @llvm.stacksave() + ret i8* %ret +} + +; Function Attrs: noinline nounwind optnone +define void @stackrestore(i8* %ptr) { +; CHECK-LABEL: stackrestore: +; CHECK: .LBB{{[0-9]+}}_2: +; CHECK-NEXT: or %s11, 0, %s0 +; CHECK-NEXT: or %s11, 0, %s9 + call void @llvm.stackrestore(i8* %ptr) + ret void +} + +; Function Attrs: nounwind +declare i8* @llvm.stacksave() +; Function Attrs: nounwind +declare void @llvm.stackrestore(i8*)