[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 07:57:40 PDT 2026
https://github.com/krzysz00 updated https://github.com/llvm/llvm-project/pull/217067
>From 2d63213bd98730bc6c049702a87d80d7198a7e31 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 3753c71c26bdf6dc6f2e91676bf3dd8d80469d90 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