From f4960da6023b8034ae68925c3223d51624621b37 Mon Sep 17 00:00:00 2001 From: Jon Chesterfield Date: Tue, 16 Apr 2024 11:24:45 +0100 Subject: [PATCH] Revert "[Verifier] Reject va_start in non-variadic function (#88809)" This reverts commit 61717c1aa1f08eb57839a21fb2d9004739022e0d. Failed a MLIR test --- llvm/lib/Analysis/Lint.cpp | 5 ++++- llvm/lib/IR/Verifier.cpp | 5 ----- llvm/test/CodeGen/AArch64/GlobalISel/vastart.ll | 2 +- llvm/test/Other/lint.ll | 7 +++++++ llvm/test/Verifier/variadic.ll | 8 -------- 5 files changed, 12 insertions(+), 15 deletions(-) delete mode 100644 llvm/test/Verifier/variadic.ll diff --git a/llvm/lib/Analysis/Lint.cpp b/llvm/lib/Analysis/Lint.cpp index 1ab856ac8830a9..0694c2995dfcce 100644 --- a/llvm/lib/Analysis/Lint.cpp +++ b/llvm/lib/Analysis/Lint.cpp @@ -350,7 +350,10 @@ void Lint::visitCallBase(CallBase &I) { } case Intrinsic::vastart: - // vastart in non-varargs function is rejected by the verifier + Check(I.getParent()->getParent()->isVarArg(), + "Undefined behavior: va_start called in a non-varargs function", + &I); + visitMemoryReference(I, MemoryLocation::getForArgument(&I, 0, TLI), std::nullopt, nullptr, MemRef::Read | MemRef::Write); break; diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 4cd61e6e531bff..516d4a0515569b 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -5798,11 +5798,6 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) { break; } - case Intrinsic::vastart: { - Check(Call.getFunction()->isVarArg(), - "va_start called in a non-varargs function"); - break; - } case Intrinsic::vector_reduce_and: case Intrinsic::vector_reduce_or: case Intrinsic::vector_reduce_xor: diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/vastart.ll b/llvm/test/CodeGen/AArch64/GlobalISel/vastart.ll index 8c6e01d934c2d8..bd576d0f70e9c1 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/vastart.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/vastart.ll @@ -3,7 +3,7 @@ declare void @llvm.va_start(ptr) -define void @test_va_start(ptr %list, ...) { +define void @test_va_start(ptr %list) { ; CHECK-LABEL: name: test_va_start ; CHECK: [[LIST:%[0-9]+]]:_(p0) = COPY $x0 ; CHECK-IOS: G_VASTART [[LIST]](p0) :: (store (s64) into %ir.list, align 1) diff --git a/llvm/test/Other/lint.ll b/llvm/test/Other/lint.ll index 6fd2d40cd2f298..6b31b31a78c98a 100644 --- a/llvm/test/Other/lint.ll +++ b/llvm/test/Other/lint.ll @@ -124,6 +124,13 @@ define void @0() nounwind { ret void } +; CHECK: va_start called in a non-varargs function +declare void @llvm.va_start(ptr) +define void @not_vararg(ptr %p) nounwind { + call void @llvm.va_start(ptr %p) + ret void +} + ; CHECK: Undefined behavior: Branch to non-blockaddress define void @use_indbr() { indirectbr ptr @foo, [label %block] diff --git a/llvm/test/Verifier/variadic.ll b/llvm/test/Verifier/variadic.ll deleted file mode 100644 index 55e4a4da0a9203..00000000000000 --- a/llvm/test/Verifier/variadic.ll +++ /dev/null @@ -1,8 +0,0 @@ -; RUN: not opt -S -passes=verify 2>&1 < %s | FileCheck %s - -; CHECK: va_start called in a non-varargs function -declare void @llvm.va_start(ptr) -define void @not_vararg(ptr %p) nounwind { - call void @llvm.va_start(ptr %p) - ret void -}