https://github.com/krzysz00 updated https://github.com/llvm/llvm-project/pull/217067
>From 1439a63974116fe53a134ad60230100c7b4ad80a Mon Sep 17 00:00:00 2001 From: Krzysztof Drewniak <[email protected]> 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 6c9ef3926f69c2d61de64b2e6e7935552de5a56d Mon Sep 17 00:00:00 2001 From: Krzysztof Drewniak <[email protected]> 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( _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
