Skip to content

Commit 7c327c2

Browse files
committed
AMDGPU: Fix broken opaque pointer handling in printf pass
This was directly considering the pointee type, and also applying special semantics to constant address space.
1 parent 53ab564 commit 7c327c2

File tree

2 files changed

+129
-22
lines changed

2 files changed

+129
-22
lines changed

llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ class AMDGPUPrintfRuntimeBindingImpl {
6363
void getConversionSpecifiers(SmallVectorImpl<char> &OpConvSpecifiers,
6464
StringRef fmt, size_t num_ops) const;
6565

66-
bool shouldPrintAsStr(char Specifier, Type *OpType) const;
6766
bool lowerPrintfForGpu(Module &M);
6867

6968
Value *simplify(Instruction *I, const TargetLibraryInfo *TLI,
@@ -132,18 +131,8 @@ void AMDGPUPrintfRuntimeBindingImpl::getConversionSpecifiers(
132131
}
133132
}
134133

135-
bool AMDGPUPrintfRuntimeBindingImpl::shouldPrintAsStr(char Specifier,
136-
Type *OpType) const {
137-
if (Specifier != 's')
138-
return false;
139-
const PointerType *PT = dyn_cast<PointerType>(OpType);
140-
if (!PT || PT->getAddressSpace() != AMDGPUAS::CONSTANT_ADDRESS)
141-
return false;
142-
Type *ElemType = PT->getContainedType(0);
143-
if (ElemType->getTypeID() != Type::IntegerTyID)
144-
return false;
145-
IntegerType *ElemIType = cast<IntegerType>(ElemType);
146-
return ElemIType->getBitWidth() == 8;
134+
static bool shouldPrintAsStr(char Specifier, Type *OpType) {
135+
return Specifier == 's' && isa<PointerType>(OpType);
147136
}
148137

149138
static void diagnoseInvalidFormatString(const CallBase *CI) {

llvm/test/CodeGen/AMDGPU/opencl-printf.ll

Lines changed: 127 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ define amdgpu_kernel void @test_kernel(i32 %n) {
1515
; GCN-LABEL: @test_kernel(
1616
; GCN-NEXT: entry:
1717
; GCN-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
18-
; GCN-NEXT: [[PRINTF_ALLOC_FN:%.*]] = call ptr addrspace(1) @__printf_alloc(i32 16)
18+
; GCN-NEXT: [[PRINTF_ALLOC_FN:%.*]] = call ptr addrspace(1) @__printf_alloc(i32 12)
1919
; GCN-NEXT: br label [[ENTRY_SPLIT:%.*]]
2020
; GCN: entry.split:
2121
; GCN-NEXT: [[TMP0:%.*]] = icmp ne ptr addrspace(1) [[PRINTF_ALLOC_FN]], null
@@ -25,10 +25,9 @@ define amdgpu_kernel void @test_kernel(i32 %n) {
2525
; GCN-NEXT: [[PRINTBUFFIDCAST:%.*]] = bitcast ptr addrspace(1) [[PRINTBUFFID]] to ptr addrspace(1)
2626
; GCN-NEXT: store i32 1, ptr addrspace(1) [[PRINTBUFFIDCAST]], align 4
2727
; GCN-NEXT: [[PRINTBUFFGEP:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 4
28-
; GCN-NEXT: [[PRINTARGPTR:%.*]] = ptrtoint ptr addrspace(5) [[STR]] to i64
2928
; GCN-NEXT: [[PRINTBUFFPTRCAST:%.*]] = bitcast ptr addrspace(1) [[PRINTBUFFGEP]] to ptr addrspace(1)
30-
; GCN-NEXT: store i64 [[PRINTARGPTR]], ptr addrspace(1) [[PRINTBUFFPTRCAST]], align 4
31-
; GCN-NEXT: [[PRINTBUFFNEXTPTR:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTBUFFGEP]], i32 8
29+
; GCN-NEXT: store i32 4144959, ptr addrspace(1) [[PRINTBUFFPTRCAST]], align 4
30+
; GCN-NEXT: [[PRINTBUFFNEXTPTR:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTBUFFGEP]], i32 4
3231
; GCN-NEXT: [[PRINTBUFFPTRCAST1:%.*]] = bitcast ptr addrspace(1) [[PRINTBUFFNEXTPTR]] to ptr addrspace(1)
3332
; GCN-NEXT: store i32 [[N:%.*]], ptr addrspace(1) [[PRINTBUFFPTRCAST1]], align 4
3433
; GCN-NEXT: br label [[TMP2]]
@@ -41,6 +40,126 @@ entry:
4140
ret void
4241
}
4342

43+
define amdgpu_kernel void @string_pointee_type(i32 %n) {
44+
; R600-LABEL: @string_pointee_type(
45+
; R600-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
46+
; R600-NEXT: [[CALL1:%.*]] = call i32 (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(5) [[STR]], i32 [[N:%.*]])
47+
; R600-NEXT: ret void
48+
;
49+
; GCN-LABEL: @string_pointee_type(
50+
; GCN-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
51+
; GCN-NEXT: [[PRINTF_ALLOC_FN:%.*]] = call ptr addrspace(1) @__printf_alloc(i32 12)
52+
; GCN-NEXT: br label [[DOTSPLIT:%.*]]
53+
; GCN: .split:
54+
; GCN-NEXT: [[TMP1:%.*]] = icmp ne ptr addrspace(1) [[PRINTF_ALLOC_FN]], null
55+
; GCN-NEXT: br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP3:%.*]]
56+
; GCN: 2:
57+
; GCN-NEXT: [[PRINTBUFFID:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 0
58+
; GCN-NEXT: [[PRINTBUFFIDCAST:%.*]] = bitcast ptr addrspace(1) [[PRINTBUFFID]] to ptr addrspace(1)
59+
; GCN-NEXT: store i32 2, ptr addrspace(1) [[PRINTBUFFIDCAST]], align 4
60+
; GCN-NEXT: [[PRINTBUFFGEP:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 4
61+
; GCN-NEXT: [[PRINTBUFFPTRCAST:%.*]] = bitcast ptr addrspace(1) [[PRINTBUFFGEP]] to ptr addrspace(1)
62+
; GCN-NEXT: store i32 4144959, ptr addrspace(1) [[PRINTBUFFPTRCAST]], align 4
63+
; GCN-NEXT: [[PRINTBUFFNEXTPTR:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTBUFFGEP]], i32 4
64+
; GCN-NEXT: [[PRINTBUFFPTRCAST1:%.*]] = bitcast ptr addrspace(1) [[PRINTBUFFNEXTPTR]] to ptr addrspace(1)
65+
; GCN-NEXT: store i32 [[N:%.*]], ptr addrspace(1) [[PRINTBUFFPTRCAST1]], align 4
66+
; GCN-NEXT: br label [[TMP3]]
67+
; GCN: 3:
68+
; GCN-NEXT: ret void
69+
;
70+
%str = alloca [9 x i8], align 1, addrspace(5)
71+
%call1 = call i32 (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(5) %str, i32 %n)
72+
ret void
73+
}
74+
75+
define amdgpu_kernel void @string_address_space4(i32 %n, ptr addrspace(4) %str) {
76+
; R600-LABEL: @string_address_space4(
77+
; R600-NEXT: [[CALL1:%.*]] = call i32 (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(4) [[STR:%.*]], i32 [[N:%.*]])
78+
; R600-NEXT: ret void
79+
;
80+
; GCN-LABEL: @string_address_space4(
81+
; GCN-NEXT: [[PRINTF_ALLOC_FN:%.*]] = call ptr addrspace(1) @__printf_alloc(i32 12)
82+
; GCN-NEXT: br label [[DOTSPLIT:%.*]]
83+
; GCN: .split:
84+
; GCN-NEXT: [[TMP1:%.*]] = icmp ne ptr addrspace(1) [[PRINTF_ALLOC_FN]], null
85+
; GCN-NEXT: br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP3:%.*]]
86+
; GCN: 2:
87+
; GCN-NEXT: [[PRINTBUFFID:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 0
88+
; GCN-NEXT: [[PRINTBUFFIDCAST:%.*]] = bitcast ptr addrspace(1) [[PRINTBUFFID]] to ptr addrspace(1)
89+
; GCN-NEXT: store i32 3, ptr addrspace(1) [[PRINTBUFFIDCAST]], align 4
90+
; GCN-NEXT: [[PRINTBUFFGEP:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 4
91+
; GCN-NEXT: [[PRINTBUFFPTRCAST:%.*]] = bitcast ptr addrspace(1) [[PRINTBUFFGEP]] to ptr addrspace(1)
92+
; GCN-NEXT: store i32 4144959, ptr addrspace(1) [[PRINTBUFFPTRCAST]], align 4
93+
; GCN-NEXT: [[PRINTBUFFNEXTPTR:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTBUFFGEP]], i32 4
94+
; GCN-NEXT: [[PRINTBUFFPTRCAST1:%.*]] = bitcast ptr addrspace(1) [[PRINTBUFFNEXTPTR]] to ptr addrspace(1)
95+
; GCN-NEXT: store i32 [[N:%.*]], ptr addrspace(1) [[PRINTBUFFPTRCAST1]], align 4
96+
; GCN-NEXT: br label [[TMP3]]
97+
; GCN: 3:
98+
; GCN-NEXT: ret void
99+
;
100+
%call1 = call i32 (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(4) %str, i32 %n)
101+
ret void
102+
}
103+
104+
define amdgpu_kernel void @string_address_space1(i32 %n, ptr addrspace(1) %str) {
105+
; R600-LABEL: @string_address_space1(
106+
; R600-NEXT: [[CALL1:%.*]] = call i32 (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(1) [[STR:%.*]], i32 [[N:%.*]])
107+
; R600-NEXT: ret void
108+
;
109+
; GCN-LABEL: @string_address_space1(
110+
; GCN-NEXT: [[PRINTF_ALLOC_FN:%.*]] = call ptr addrspace(1) @__printf_alloc(i32 12)
111+
; GCN-NEXT: br label [[DOTSPLIT:%.*]]
112+
; GCN: .split:
113+
; GCN-NEXT: [[TMP1:%.*]] = icmp ne ptr addrspace(1) [[PRINTF_ALLOC_FN]], null
114+
; GCN-NEXT: br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP3:%.*]]
115+
; GCN: 2:
116+
; GCN-NEXT: [[PRINTBUFFID:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 0
117+
; GCN-NEXT: [[PRINTBUFFIDCAST:%.*]] = bitcast ptr addrspace(1) [[PRINTBUFFID]] to ptr addrspace(1)
118+
; GCN-NEXT: store i32 4, ptr addrspace(1) [[PRINTBUFFIDCAST]], align 4
119+
; GCN-NEXT: [[PRINTBUFFGEP:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 4
120+
; GCN-NEXT: [[PRINTBUFFPTRCAST:%.*]] = bitcast ptr addrspace(1) [[PRINTBUFFGEP]] to ptr addrspace(1)
121+
; GCN-NEXT: store i32 4144959, ptr addrspace(1) [[PRINTBUFFPTRCAST]], align 4
122+
; GCN-NEXT: [[PRINTBUFFNEXTPTR:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTBUFFGEP]], i32 4
123+
; GCN-NEXT: [[PRINTBUFFPTRCAST1:%.*]] = bitcast ptr addrspace(1) [[PRINTBUFFNEXTPTR]] to ptr addrspace(1)
124+
; GCN-NEXT: store i32 [[N:%.*]], ptr addrspace(1) [[PRINTBUFFPTRCAST1]], align 4
125+
; GCN-NEXT: br label [[TMP3]]
126+
; GCN: 3:
127+
; GCN-NEXT: ret void
128+
;
129+
%call1 = call i32 (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(1) %str, i32 %n)
130+
ret void
131+
}
132+
133+
define amdgpu_kernel void @string_format_passed_i32(i32 %n, i32 %str) {
134+
; R600-LABEL: @string_format_passed_i32(
135+
; R600-NEXT: [[CALL1:%.*]] = call i32 (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, i32 [[STR:%.*]], i32 [[N:%.*]])
136+
; R600-NEXT: ret void
137+
;
138+
; GCN-LABEL: @string_format_passed_i32(
139+
; GCN-NEXT: [[PRINTF_ALLOC_FN:%.*]] = call ptr addrspace(1) @__printf_alloc(i32 12)
140+
; GCN-NEXT: br label [[DOTSPLIT:%.*]]
141+
; GCN: .split:
142+
; GCN-NEXT: [[TMP1:%.*]] = icmp ne ptr addrspace(1) [[PRINTF_ALLOC_FN]], null
143+
; GCN-NEXT: br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP3:%.*]]
144+
; GCN: 2:
145+
; GCN-NEXT: [[PRINTBUFFID:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 0
146+
; GCN-NEXT: [[PRINTBUFFIDCAST:%.*]] = bitcast ptr addrspace(1) [[PRINTBUFFID]] to ptr addrspace(1)
147+
; GCN-NEXT: store i32 5, ptr addrspace(1) [[PRINTBUFFIDCAST]], align 4
148+
; GCN-NEXT: [[PRINTBUFFGEP:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 4
149+
; GCN-NEXT: [[PRINTBUFFPTRCAST:%.*]] = bitcast ptr addrspace(1) [[PRINTBUFFGEP]] to ptr addrspace(1)
150+
; GCN-NEXT: store i32 [[STR:%.*]], ptr addrspace(1) [[PRINTBUFFPTRCAST]], align 4
151+
; GCN-NEXT: [[PRINTBUFFNEXTPTR:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTBUFFGEP]], i32 4
152+
; GCN-NEXT: [[PRINTBUFFPTRCAST1:%.*]] = bitcast ptr addrspace(1) [[PRINTBUFFNEXTPTR]] to ptr addrspace(1)
153+
; GCN-NEXT: store i32 [[N:%.*]], ptr addrspace(1) [[PRINTBUFFPTRCAST1]], align 4
154+
; GCN-NEXT: br label [[TMP3]]
155+
; GCN: 3:
156+
; GCN-NEXT: ret void
157+
;
158+
%call1 = call i32 (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, i32 %str, i32 %n)
159+
ret void
160+
}
161+
162+
44163
@str.as1 = private unnamed_addr addrspace(1) constant [6 x i8] c"%s:%d\00", align 1
45164

46165
define amdgpu_kernel void @test_kernel_addrspacecasted_format_str(i32 %n) {
@@ -55,20 +174,19 @@ define amdgpu_kernel void @test_kernel_addrspacecasted_format_str(i32 %n) {
55174
; GCN-NEXT: entry:
56175
; GCN-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5)
57176
; GCN-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [9 x i8], ptr addrspace(5) [[STR]], i32 0, i32 0
58-
; GCN-NEXT: [[PRINTF_ALLOC_FN:%.*]] = call ptr addrspace(1) @__printf_alloc(i32 16)
177+
; GCN-NEXT: [[PRINTF_ALLOC_FN:%.*]] = call ptr addrspace(1) @__printf_alloc(i32 12)
59178
; GCN-NEXT: br label [[ENTRY_SPLIT:%.*]]
60179
; GCN: entry.split:
61180
; GCN-NEXT: [[TMP0:%.*]] = icmp ne ptr addrspace(1) [[PRINTF_ALLOC_FN]], null
62181
; GCN-NEXT: br i1 [[TMP0]], label [[TMP1:%.*]], label [[TMP2:%.*]]
63182
; GCN: 1:
64183
; GCN-NEXT: [[PRINTBUFFID:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 0
65184
; GCN-NEXT: [[PRINTBUFFIDCAST:%.*]] = bitcast ptr addrspace(1) [[PRINTBUFFID]] to ptr addrspace(1)
66-
; GCN-NEXT: store i32 2, ptr addrspace(1) [[PRINTBUFFIDCAST]], align 4
185+
; GCN-NEXT: store i32 6, ptr addrspace(1) [[PRINTBUFFIDCAST]], align 4
67186
; GCN-NEXT: [[PRINTBUFFGEP:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 4
68-
; GCN-NEXT: [[PRINTARGPTR:%.*]] = ptrtoint ptr addrspace(5) [[ARRAYDECAY]] to i64
69187
; GCN-NEXT: [[PRINTBUFFPTRCAST:%.*]] = bitcast ptr addrspace(1) [[PRINTBUFFGEP]] to ptr addrspace(1)
70-
; GCN-NEXT: store i64 [[PRINTARGPTR]], ptr addrspace(1) [[PRINTBUFFPTRCAST]], align 4
71-
; GCN-NEXT: [[PRINTBUFFNEXTPTR:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTBUFFGEP]], i32 8
188+
; GCN-NEXT: store i32 4144959, ptr addrspace(1) [[PRINTBUFFPTRCAST]], align 4
189+
; GCN-NEXT: [[PRINTBUFFNEXTPTR:%.*]] = getelementptr i8, ptr addrspace(1) [[PRINTBUFFGEP]], i32 4
72190
; GCN-NEXT: [[PRINTBUFFPTRCAST1:%.*]] = bitcast ptr addrspace(1) [[PRINTBUFFNEXTPTR]] to ptr addrspace(1)
73191
; GCN-NEXT: store i32 [[N:%.*]], ptr addrspace(1) [[PRINTBUFFPTRCAST1]], align 4
74192
; GCN-NEXT: br label [[TMP2]]

0 commit comments

Comments
 (0)