Skip to content

Commit 96e0bbc

Browse files
authored
AMDGPU: Fix parsing wrong operand format for read_register/write_register (#162414)
Apparently the IR verifier doesn't enforce the correct structure. Also I do not know why we have this extra level of wrapper in the intrinsic, it just makes it harder to get at the string. I also do not know why kokkos is using these intrinsics, but it shouldn't.
1 parent 0540f04 commit 96e0bbc

File tree

2 files changed

+30
-15
lines changed

2 files changed

+30
-15
lines changed

llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1335,7 +1335,9 @@ struct AAAMDGPUNoAGPR : public StateWrapper<BooleanState, AbstractAttribute> {
13351335
case Intrinsic::read_register:
13361336
case Intrinsic::read_volatile_register: {
13371337
const MDString *RegName = cast<MDString>(
1338-
cast<MetadataAsValue>(CB.getArgOperand(0))->getMetadata());
1338+
cast<MDNode>(
1339+
cast<MetadataAsValue>(CB.getArgOperand(0))->getMetadata())
1340+
->getOperand(0));
13391341
auto [Kind, RegIdx, NumRegs] =
13401342
AMDGPU::parseAsmPhysRegName(RegName->getString());
13411343
return Kind != 'a';

llvm/test/CodeGen/AMDGPU/amdgpu-attributor-no-agpr.ll

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -704,80 +704,87 @@ define amdgpu_kernel void @align2_align4_virtreg() {
704704
define amdgpu_kernel void @kernel_uses_write_register_a55() {
705705
; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_write_register_a55(
706706
; CHECK-SAME: ) #[[ATTR3:[0-9]+]] {
707-
; CHECK-NEXT: call void @llvm.write_register.i32(metadata !"a55", i32 0)
707+
; CHECK-NEXT: call void @llvm.write_register.i32(metadata [[META0:![0-9]+]], i32 0)
708708
; CHECK-NEXT: ret void
709709
;
710-
call void @llvm.write_register.i64(metadata !"a55", i32 0)
710+
call void @llvm.write_register.i64(metadata !0, i32 0)
711711
ret void
712712
}
713713

714714
define amdgpu_kernel void @kernel_uses_write_register_v55() {
715715
; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_write_register_v55(
716716
; CHECK-SAME: ) #[[ATTR4:[0-9]+]] {
717-
; CHECK-NEXT: call void @llvm.write_register.i32(metadata !"v55", i32 0)
717+
; CHECK-NEXT: call void @llvm.write_register.i32(metadata [[META1:![0-9]+]], i32 0)
718718
; CHECK-NEXT: ret void
719719
;
720-
call void @llvm.write_register.i64(metadata !"v55", i32 0)
720+
call void @llvm.write_register.i64(metadata !1, i32 0)
721721
ret void
722722
}
723723

724724
define amdgpu_kernel void @kernel_uses_write_register_a55_57() {
725725
; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_write_register_a55_57(
726726
; CHECK-SAME: ) #[[ATTR3]] {
727-
; CHECK-NEXT: call void @llvm.write_register.i96(metadata !"a[55:57]", i96 0)
727+
; CHECK-NEXT: call void @llvm.write_register.i96(metadata [[META2:![0-9]+]], i96 0)
728728
; CHECK-NEXT: ret void
729729
;
730-
call void @llvm.write_register.i64(metadata !"a[55:57]", i96 0)
730+
call void @llvm.write_register.i64(metadata !2, i96 0)
731731
ret void
732732
}
733733

734734
define amdgpu_kernel void @kernel_uses_read_register_a55(ptr addrspace(1) %ptr) {
735735
; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_read_register_a55(
736736
; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR3]] {
737-
; CHECK-NEXT: [[REG:%.*]] = call i32 @llvm.read_register.i32(metadata !"a55")
737+
; CHECK-NEXT: [[REG:%.*]] = call i32 @llvm.read_register.i32(metadata [[META0]])
738738
; CHECK-NEXT: store i32 [[REG]], ptr addrspace(1) [[PTR]], align 4
739739
; CHECK-NEXT: ret void
740740
;
741-
%reg = call i32 @llvm.read_register.i64(metadata !"a55")
741+
%reg = call i32 @llvm.read_register.i64(metadata !0)
742742
store i32 %reg, ptr addrspace(1) %ptr
743743
ret void
744744
}
745745

746746
define amdgpu_kernel void @kernel_uses_read_volatile_register_a55(ptr addrspace(1) %ptr) {
747747
; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_read_volatile_register_a55(
748748
; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR3]] {
749-
; CHECK-NEXT: [[REG:%.*]] = call i32 @llvm.read_volatile_register.i32(metadata !"a55")
749+
; CHECK-NEXT: [[REG:%.*]] = call i32 @llvm.read_volatile_register.i32(metadata [[META0]])
750750
; CHECK-NEXT: store i32 [[REG]], ptr addrspace(1) [[PTR]], align 4
751751
; CHECK-NEXT: ret void
752752
;
753-
%reg = call i32 @llvm.read_volatile_register.i64(metadata !"a55")
753+
%reg = call i32 @llvm.read_volatile_register.i64(metadata !0)
754754
store i32 %reg, ptr addrspace(1) %ptr
755755
ret void
756756
}
757757

758758
define amdgpu_kernel void @kernel_uses_read_register_a56_59(ptr addrspace(1) %ptr) {
759759
; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_read_register_a56_59(
760760
; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR3]] {
761-
; CHECK-NEXT: [[REG:%.*]] = call i128 @llvm.read_register.i128(metadata !"a[56:59]")
761+
; CHECK-NEXT: [[REG:%.*]] = call i128 @llvm.read_register.i128(metadata [[META3:![0-9]+]])
762762
; CHECK-NEXT: store i128 [[REG]], ptr addrspace(1) [[PTR]], align 8
763763
; CHECK-NEXT: ret void
764764
;
765-
%reg = call i128 @llvm.read_register.i64(metadata !"a[56:59]")
765+
%reg = call i128 @llvm.read_register.i64(metadata !3)
766766
store i128 %reg, ptr addrspace(1) %ptr
767767
ret void
768768
}
769769

770770
define amdgpu_kernel void @kernel_uses_write_register_out_of_bounds_a256() {
771771
; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_write_register_out_of_bounds_a256(
772772
; CHECK-SAME: ) #[[ATTR3]] {
773-
; CHECK-NEXT: call void @llvm.write_register.i32(metadata !"a256", i32 0)
773+
; CHECK-NEXT: call void @llvm.write_register.i32(metadata [[META4:![0-9]+]], i32 0)
774774
; CHECK-NEXT: ret void
775775
;
776-
call void @llvm.write_register.i64(metadata !"a256", i32 0)
776+
call void @llvm.write_register.i64(metadata !4, i32 0)
777777
ret void
778778
}
779779

780780
attributes #0 = { "amdgpu-agpr-alloc"="0" }
781+
782+
!0 = !{!"a55"}
783+
!1 = !{!"v55"}
784+
!2 = !{!"a[55:57]"}
785+
!3 = !{!"a[56:59]"}
786+
!4 = !{!"a256"}
787+
781788
;.
782789
; CHECK: attributes #[[ATTR0]] = { "amdgpu-agpr-alloc"="0" "target-cpu"="gfx90a" "uniform-work-group-size"="false" }
783790
; CHECK: attributes #[[ATTR1]] = { "target-cpu"="gfx90a" "uniform-work-group-size"="false" }
@@ -791,3 +798,9 @@ attributes #0 = { "amdgpu-agpr-alloc"="0" }
791798
; CHECK: attributes #[[ATTR9:[0-9]+]] = { nocallback nounwind "target-cpu"="gfx90a" }
792799
; CHECK: attributes #[[ATTR10]] = { "amdgpu-agpr-alloc"="0" }
793800
;.
801+
; CHECK: [[META0]] = !{!"a55"}
802+
; CHECK: [[META1]] = !{!"v55"}
803+
; CHECK: [[META2]] = !{!"a[55:57]"}
804+
; CHECK: [[META3]] = !{!"a[56:59]"}
805+
; CHECK: [[META4]] = !{!"a256"}
806+
;.

0 commit comments

Comments
 (0)