From f0d898f36bceff94d40e2022814978fa5fd0cc8f Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Tue, 24 Jun 2025 11:11:52 +0900 Subject: [PATCH] DAG: Move get_dynamic_area_offset type check to IR verifier (#145268) Also fix the LangRef to match the implementation. This was checking against the alloca address space size rather than the default address space. The check was also more permissive than the LangRef. The error check permitted any size less than the pointer size; follow the stricter wording of the LangRef. --- llvm/docs/LangRef.rst | 2 +- .../SelectionDAG/SelectionDAGBuilder.cpp | 6 ---- llvm/lib/IR/Verifier.cpp | 9 ++++++ llvm/test/Verifier/get_dynamic_area_offset.ll | 30 +++++++++++++++++++ 4 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 llvm/test/Verifier/get_dynamic_area_offset.ll diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst index f9ee3243eea9..d77c65905523 100644 --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -14600,7 +14600,7 @@ Semantics: compile-time-known constant value. The return value type of :ref:`llvm.get.dynamic.area.offset ` - must match the target's default address space's (address space 0) pointer type. + must match the target's :ref:`alloca address space ` type. '``llvm.prefetch``' Intrinsic ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index c01f1e792847..04d6fd5f48cc 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -7320,13 +7320,7 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, return; case Intrinsic::get_dynamic_area_offset: { SDValue Op = getRoot(); - EVT PtrTy = TLI.getFrameIndexTy(DAG.getDataLayout()); EVT ResTy = TLI.getValueType(DAG.getDataLayout(), I.getType()); - // Result type for @llvm.get.dynamic.area.offset should match PtrTy for - // target. - if (PtrTy.getFixedSizeInBits() < ResTy.getFixedSizeInBits()) - report_fatal_error("Wrong result type for @llvm.get.dynamic.area.offset" - " intrinsic!"); Res = DAG.getNode(ISD::GET_DYNAMIC_AREA_OFFSET, sdl, DAG.getVTList(ResTy), Op); DAG.setRoot(Op); diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index f0a4d7b6a4c1..71261343b348 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -6061,6 +6061,15 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) { "va_start called in a non-varargs function"); break; } + case Intrinsic::get_dynamic_area_offset: { + auto *IntTy = dyn_cast(Call.getType()); + Check(IntTy && DL.getPointerSizeInBits(DL.getAllocaAddrSpace()) == + IntTy->getBitWidth(), + "get_dynamic_area_offset result type must be scalar integer matching " + "alloca address space width", + Call); + break; + } case Intrinsic::vector_reduce_and: case Intrinsic::vector_reduce_or: case Intrinsic::vector_reduce_xor: diff --git a/llvm/test/Verifier/get_dynamic_area_offset.ll b/llvm/test/Verifier/get_dynamic_area_offset.ll new file mode 100644 index 000000000000..89c060e390b9 --- /dev/null +++ b/llvm/test/Verifier/get_dynamic_area_offset.ll @@ -0,0 +1,30 @@ +; RUN: not llvm-as -disable-output %s 2>&1 | FileCheck %s + +target datalayout = "p0:64:64-p5:32:32-A5" + +declare i64 @llvm.get.dynamic.area.offset.i64() + +; CHECK: get_dynamic_area_offset result type must be scalar integer matching alloca address space width +; CHECK-NEXT: %res = call i64 @llvm.get.dynamic.area.offset.i64() +define i64 @test_dynamic_area_too_big() { + %res = call i64 @llvm.get.dynamic.area.offset.i64() + ret i64 %res +} + +declare i16 @llvm.get.dynamic.area.offset.i16() + +; CHECK: get_dynamic_area_offset result type must be scalar integer matching alloca address space width +; CHECK-NEXT: %res = call i16 @llvm.get.dynamic.area.offset.i16() +define i16 @test_dynamic_area_too_small() { + %res = call i16 @llvm.get.dynamic.area.offset.i16() + ret i16 %res +} + +declare <2 x i32> @llvm.get.dynamic.area.offset.v2i32() + +; CHECK: get_dynamic_area_offset result type must be scalar integer matching alloca address space width +; CHECK-NEXT: %res = call <2 x i32> @llvm.get.dynamic.area.offset.v2i32() +define <2 x i32> @test_dynamic_area_vector() { + %res = call <2 x i32> @llvm.get.dynamic.area.offset.v2i32() + ret <2 x i32> %res +}