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 <[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 3753c71c26bdf6dc6f2e91676bf3dd8d80469d90 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
