[llvm-branch-commits] [llvm] [AMDGPU] Pre-commit tests for num_records canonicalizations (PR #217067)

Krzysztof Drewniak via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Aug 25 08:05:53 PDT 2026


https://github.com/krzysz00 updated https://github.com/llvm/llvm-project/pull/217067

>From 315c57596ded99cc71bce2c43779a8ae9e841699 Mon Sep 17 00:00:00 2001
From: Krzysztof Drewniak <Krzysztof.Drewniak at amd.com>
Date: Tue, 18 Aug 2026 19:44:58 +0000
Subject: [PATCH 1/2] [AMDGPU] Pre-commit tests for num_records
 canonicalization

Add tests for having InstCombine canonicalize the num_records argument
of llvm.amdgcn.make.buffer.rsrc to the width it will ultimately have,
which lets later passes see that, for example, the high bits of the i64
that Clang emits aren't used.

AI disclosure: Claude generated these and I've looked at them
---
 .../AMDGPU/make-buffer-rsrc-num-records.ll    | 153 ++++++++++++++++++
 1 file changed, 153 insertions(+)
 create mode 100644 llvm/test/Transforms/InstCombine/AMDGPU/make-buffer-rsrc-num-records.ll

diff --git a/llvm/test/Transforms/InstCombine/AMDGPU/make-buffer-rsrc-num-records.ll b/llvm/test/Transforms/InstCombine/AMDGPU/make-buffer-rsrc-num-records.ll
new file mode 100644
index 0000000000000..534384f3183b4
--- /dev/null
+++ b/llvm/test/Transforms/InstCombine/AMDGPU/make-buffer-rsrc-num-records.ll
@@ -0,0 +1,153 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -mtriple=amdgcn-amd-amdhsa -passes=instcombine -S < %s | FileCheck %s --check-prefixes=GENERIC
+; RUN: opt -mtriple=amdgpu9.00-amd-amdhsa -passes=instcombine -S < %s | FileCheck %s --check-prefixes=RECORDS32
+; RUN: opt -mtriple=amdgpu12.50-amd-amdhsa -passes=instcombine -S < %s | FileCheck %s --check-prefixes=RECORDS45
+
+define ptr addrspace(8) @from_i64(ptr %p, i16 %stride, i64 %num, i32 %flags) {
+; GENERIC-LABEL: define ptr addrspace(8) @from_i64(
+; GENERIC-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i64 [[NUM:%.*]], i32 [[FLAGS:%.*]]) {
+; GENERIC-NEXT:    [[RSRC:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i64(ptr [[P]], i16 [[STRIDE]], i64 [[NUM]], i32 [[FLAGS]])
+; GENERIC-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+; RECORDS32-LABEL: define ptr addrspace(8) @from_i64(
+; RECORDS32-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i64 [[NUM:%.*]], i32 [[FLAGS:%.*]]) {
+; RECORDS32-NEXT:    [[RSRC:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i64(ptr [[P]], i16 [[STRIDE]], i64 [[NUM]], i32 [[FLAGS]])
+; RECORDS32-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+; RECORDS45-LABEL: define ptr addrspace(8) @from_i64(
+; RECORDS45-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i64 [[NUM:%.*]], i32 [[FLAGS:%.*]]) {
+; RECORDS45-NEXT:    [[RSRC:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i64(ptr [[P]], i16 [[STRIDE]], i64 [[NUM]], i32 [[FLAGS]])
+; RECORDS45-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+  %rsrc = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i64(ptr %p, i16 %stride, i64 %num, i32 %flags)
+  ret ptr addrspace(8) %rsrc
+}
+
+define ptr addrspace(8) @from_i128(ptr %p, i16 %stride, i128 %num, i32 %flags) {
+; GENERIC-LABEL: define ptr addrspace(8) @from_i128(
+; GENERIC-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i128 [[NUM:%.*]], i32 [[FLAGS:%.*]]) {
+; GENERIC-NEXT:    [[RSRC:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i128(ptr [[P]], i16 [[STRIDE]], i128 [[NUM]], i32 [[FLAGS]])
+; GENERIC-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+; RECORDS32-LABEL: define ptr addrspace(8) @from_i128(
+; RECORDS32-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i128 [[NUM:%.*]], i32 [[FLAGS:%.*]]) {
+; RECORDS32-NEXT:    [[RSRC:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i128(ptr [[P]], i16 [[STRIDE]], i128 [[NUM]], i32 [[FLAGS]])
+; RECORDS32-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+; RECORDS45-LABEL: define ptr addrspace(8) @from_i128(
+; RECORDS45-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i128 [[NUM:%.*]], i32 [[FLAGS:%.*]]) {
+; RECORDS45-NEXT:    [[RSRC:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i128(ptr [[P]], i16 [[STRIDE]], i128 [[NUM]], i32 [[FLAGS]])
+; RECORDS45-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+  %rsrc = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i128(ptr %p, i16 %stride, i128 %num, i32 %flags)
+  ret ptr addrspace(8) %rsrc
+}
+
+define ptr addrspace(8) @from_i32(ptr %p, i16 %stride, i32 %num, i32 %flags) {
+; GENERIC-LABEL: define ptr addrspace(8) @from_i32(
+; GENERIC-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i32 [[NUM:%.*]], i32 [[FLAGS:%.*]]) {
+; GENERIC-NEXT:    [[RSRC:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i32(ptr [[P]], i16 [[STRIDE]], i32 [[NUM]], i32 [[FLAGS]])
+; GENERIC-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+; RECORDS32-LABEL: define ptr addrspace(8) @from_i32(
+; RECORDS32-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i32 [[NUM:%.*]], i32 [[FLAGS:%.*]]) {
+; RECORDS32-NEXT:    [[RSRC:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i32(ptr [[P]], i16 [[STRIDE]], i32 [[NUM]], i32 [[FLAGS]])
+; RECORDS32-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+; RECORDS45-LABEL: define ptr addrspace(8) @from_i32(
+; RECORDS45-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i32 [[NUM:%.*]], i32 [[FLAGS:%.*]]) {
+; RECORDS45-NEXT:    [[RSRC:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i32(ptr [[P]], i16 [[STRIDE]], i32 [[NUM]], i32 [[FLAGS]])
+; RECORDS45-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+  %rsrc = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i32(ptr %p, i16 %stride, i32 %num, i32 %flags)
+  ret ptr addrspace(8) %rsrc
+}
+
+define ptr addrspace(8) @from_i45(ptr %p, i16 %stride, i45 %num, i32 %flags) {
+; GENERIC-LABEL: define ptr addrspace(8) @from_i45(
+; GENERIC-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i45 [[NUM:%.*]], i32 [[FLAGS:%.*]]) {
+; GENERIC-NEXT:    [[RSRC:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i45(ptr [[P]], i16 [[STRIDE]], i45 [[NUM]], i32 [[FLAGS]])
+; GENERIC-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+; RECORDS32-LABEL: define ptr addrspace(8) @from_i45(
+; RECORDS32-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i45 [[NUM:%.*]], i32 [[FLAGS:%.*]]) {
+; RECORDS32-NEXT:    [[RSRC:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i45(ptr [[P]], i16 [[STRIDE]], i45 [[NUM]], i32 [[FLAGS]])
+; RECORDS32-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+; RECORDS45-LABEL: define ptr addrspace(8) @from_i45(
+; RECORDS45-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i45 [[NUM:%.*]], i32 [[FLAGS:%.*]]) {
+; RECORDS45-NEXT:    [[RSRC:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i45(ptr [[P]], i16 [[STRIDE]], i45 [[NUM]], i32 [[FLAGS]])
+; RECORDS45-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+  %rsrc = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i45(ptr %p, i16 %stride, i45 %num, i32 %flags)
+  ret ptr addrspace(8) %rsrc
+}
+
+define ptr addrspace(8) @from_i16(ptr %p, i16 %stride, i16 %num, i32 %flags) {
+; GENERIC-LABEL: define ptr addrspace(8) @from_i16(
+; GENERIC-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i16 [[NUM:%.*]], i32 [[FLAGS:%.*]]) {
+; GENERIC-NEXT:    [[RSRC:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i16(ptr [[P]], i16 [[STRIDE]], i16 [[NUM]], i32 [[FLAGS]])
+; GENERIC-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+; RECORDS32-LABEL: define ptr addrspace(8) @from_i16(
+; RECORDS32-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i16 [[NUM:%.*]], i32 [[FLAGS:%.*]]) {
+; RECORDS32-NEXT:    [[RSRC:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i16(ptr [[P]], i16 [[STRIDE]], i16 [[NUM]], i32 [[FLAGS]])
+; RECORDS32-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+; RECORDS45-LABEL: define ptr addrspace(8) @from_i16(
+; RECORDS45-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i16 [[NUM:%.*]], i32 [[FLAGS:%.*]]) {
+; RECORDS45-NEXT:    [[RSRC:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i16(ptr [[P]], i16 [[STRIDE]], i16 [[NUM]], i32 [[FLAGS]])
+; RECORDS45-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+  %rsrc = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i16(ptr %p, i16 %stride, i16 %num, i32 %flags)
+  ret ptr addrspace(8) %rsrc
+}
+
+define ptr addrspace(8) @from_constant(ptr %p, i16 %stride, i32 %flags) {
+; GENERIC-LABEL: define ptr addrspace(8) @from_constant(
+; GENERIC-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i32 [[FLAGS:%.*]]) {
+; GENERIC-NEXT:    [[RSRC:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i64(ptr [[P]], i16 [[STRIDE]], i64 4294967296, i32 [[FLAGS]])
+; GENERIC-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+; RECORDS32-LABEL: define ptr addrspace(8) @from_constant(
+; RECORDS32-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i32 [[FLAGS:%.*]]) {
+; RECORDS32-NEXT:    [[RSRC:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i64(ptr [[P]], i16 [[STRIDE]], i64 4294967296, i32 [[FLAGS]])
+; RECORDS32-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+; RECORDS45-LABEL: define ptr addrspace(8) @from_constant(
+; RECORDS45-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i32 [[FLAGS:%.*]]) {
+; RECORDS45-NEXT:    [[RSRC:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i64(ptr [[P]], i16 [[STRIDE]], i64 4294967296, i32 [[FLAGS]])
+; RECORDS45-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+  %rsrc = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i64(ptr %p, i16 %stride, i64 4294967296, i32 %flags)
+  ret ptr addrspace(8) %rsrc
+}
+
+define ptr addrspace(8) @keeps_metadata_and_attributes(ptr %p, i16 %stride, i64 %num, i32 %flags) {
+; GENERIC-LABEL: define ptr addrspace(8) @keeps_metadata_and_attributes(
+; GENERIC-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i64 [[NUM:%.*]], i32 [[FLAGS:%.*]]) {
+; GENERIC-NEXT:    [[RSRC:%.*]] = tail call align 16 ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i64(ptr noundef [[P]], i16 [[STRIDE]], i64 [[NUM]], i32 [[FLAGS]]), !amdgpu.uniform [[META0:![0-9]+]]
+; GENERIC-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+; RECORDS32-LABEL: define ptr addrspace(8) @keeps_metadata_and_attributes(
+; RECORDS32-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i64 [[NUM:%.*]], i32 [[FLAGS:%.*]]) {
+; RECORDS32-NEXT:    [[RSRC:%.*]] = tail call align 16 ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i64(ptr noundef [[P]], i16 [[STRIDE]], i64 [[NUM]], i32 [[FLAGS]]), !amdgpu.uniform [[META0:![0-9]+]]
+; RECORDS32-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+; RECORDS45-LABEL: define ptr addrspace(8) @keeps_metadata_and_attributes(
+; RECORDS45-SAME: ptr [[P:%.*]], i16 [[STRIDE:%.*]], i64 [[NUM:%.*]], i32 [[FLAGS:%.*]]) {
+; RECORDS45-NEXT:    [[RSRC:%.*]] = tail call align 16 ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i64(ptr noundef [[P]], i16 [[STRIDE]], i64 [[NUM]], i32 [[FLAGS]]), !amdgpu.uniform [[META0:![0-9]+]]
+; RECORDS45-NEXT:    ret ptr addrspace(8) [[RSRC]]
+;
+  %rsrc = tail call align 16 ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0.i64(ptr noundef %p, i16 %stride, i64 %num, i32 %flags), !amdgpu.uniform !0
+  ret ptr addrspace(8) %rsrc
+}
+
+!0 = !{}
+;.
+; GENERIC: [[META0]] = !{}
+;.
+; RECORDS32: [[META0]] = !{}
+;.
+; RECORDS45: [[META0]] = !{}
+;.

>From c03943dbb4a3b8f9fa23cc75979ca53adaa1a920 Mon Sep 17 00:00:00 2001
From: Krzysztof Drewniak <Krzysztof.Drewniak at amd.com>
Date: Tue, 18 Aug 2026 21:47:04 +0000
Subject: [PATCH 2/2] Clean up triples

---
 .../InstCombine/AMDGPU/make-buffer-rsrc-num-records.ll      | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/llvm/test/Transforms/InstCombine/AMDGPU/make-buffer-rsrc-num-records.ll b/llvm/test/Transforms/InstCombine/AMDGPU/make-buffer-rsrc-num-records.ll
index 534384f3183b4..7a6e6b43e345e 100644
--- a/llvm/test/Transforms/InstCombine/AMDGPU/make-buffer-rsrc-num-records.ll
+++ b/llvm/test/Transforms/InstCombine/AMDGPU/make-buffer-rsrc-num-records.ll
@@ -1,7 +1,7 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
-; RUN: opt -mtriple=amdgcn-amd-amdhsa -passes=instcombine -S < %s | FileCheck %s --check-prefixes=GENERIC
-; RUN: opt -mtriple=amdgpu9.00-amd-amdhsa -passes=instcombine -S < %s | FileCheck %s --check-prefixes=RECORDS32
-; RUN: opt -mtriple=amdgpu12.50-amd-amdhsa -passes=instcombine -S < %s | FileCheck %s --check-prefixes=RECORDS45
+; RUN: opt -mtriple=amdgpu-- -passes=instcombine -S < %s | FileCheck %s --check-prefixes=GENERIC
+; RUN: opt -mtriple=amdgpu9.00-- -passes=instcombine -S < %s | FileCheck %s --check-prefixes=RECORDS32
+; RUN: opt -mtriple=amdgpu12.50-- -passes=instcombine -S < %s | FileCheck %s --check-prefixes=RECORDS45
 
 define ptr addrspace(8) @from_i64(ptr %p, i16 %stride, i64 %num, i32 %flags) {
 ; GENERIC-LABEL: define ptr addrspace(8) @from_i64(



More information about the llvm-branch-commits mailing list