Skip to content

Commit 30d3651

Browse files
JanRehders-AMDtsymalla-AMD
authored andcommitted
Change name mangling for intrinsic functions
We want to avoid confusion when one op's intrinsic is the prefix of another one. Using a character which we don't use for intrinsic function names ensures this. Fixes #2
1 parent 8640583 commit 30d3651

File tree

5 files changed

+43
-42
lines changed

5 files changed

+43
-42
lines changed

lib/Dialect/Dialect.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,8 @@ bool llvm_dialects::detail::isOperationDecl(llvm::StringRef fn,
281281
if (!fn.starts_with(mnemonic))
282282
return false;
283283

284-
return fn[mnemonic.size()] == '.';
284+
return fn.size() >= mnemonic.size() + 2 && fn[mnemonic.size()] == '_' &&
285+
fn[mnemonic.size() + 1] == '_';
285286
}
286287

287288
return fn == mnemonic;

lib/Dialect/Utils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ std::string llvm_dialects::getMangledName(StringRef name,
130130
ArrayRef<Type *> overloadTypes) {
131131
std::string result = name.str();
132132
for (Type *ty : overloadTypes) {
133-
result += '.';
133+
result += "__";
134134

135135
bool hasUnnamedType = false;
136136
result += getMangledTypeStr(ty, hasUnnamedType);

test/example/test-builder.test

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,32 +4,32 @@
44

55
; CHECK-LABEL: @example(
66
; CHECK-NEXT: entry:
7-
; CHECK-NEXT: [[TMP0:%.*]] = call i32 @xd.read.i32()
7+
; CHECK-NEXT: [[TMP0:%.*]] = call i32 @xd.read__i32()
88
; CHECK-NEXT: [[TMP1:%.*]] = call i64 (...) @xd.sizeof(double poison)
9-
; CHECK-NEXT: [[TMP2:%.*]] = call i32 (...) @xd.itrunc.i32(i64 [[TMP1]])
9+
; CHECK-NEXT: [[TMP2:%.*]] = call i32 (...) @xd.itrunc__i32(i64 [[TMP1]])
1010
; CHECK-NEXT: [[TMP3:%.*]] = call i32 @xd.add32(i32 [[TMP0]], i32 [[TMP2]], i32 7)
11-
; CHECK-NEXT: [[TMP4:%.*]] = call i32 (...) @xd.combine.i32(i32 [[TMP3]], i32 [[TMP0]])
12-
; CHECK-NEXT: [[TMP5:%.*]] = call i64 (...) @xd.iext.i64(i32 [[TMP4]])
11+
; CHECK-NEXT: [[TMP4:%.*]] = call i32 (...) @xd.combine__i32(i32 [[TMP3]], i32 [[TMP0]])
12+
; CHECK-NEXT: [[TMP5:%.*]] = call i64 (...) @xd.iext__i64(i32 [[TMP4]])
1313
; CHECK-NEXT: call void (...) @xd.write(i64 [[TMP5]])
14-
; CHECK-NEXT: [[TMP6:%.*]] = call <2 x i32> @xd.read.v2i32()
15-
; CHECK-NEXT: [[TMP7:%.*]] = call target("xd.vector", i32, 1, 2) (...) @xd.fromfixedvector.txd.vector_i32_1_2t(<2 x i32> [[TMP6]])
16-
; CHECK-NEXT: [[TMP8:%.*]] = call target("xd.vector", i32, 1, 4) @xd.read.txd.vector_i32_1_4t()
17-
; CHECK-NEXT: [[TMP9:%.*]] = call i32 (...) @xd.extractelement.i32(target("xd.vector", i32, 1, 4) [[TMP8]], i32 [[TMP0]])
18-
; CHECK-NEXT: [[TMP10:%.*]] = call i32 (...) @xd.extractelement.i32(target("xd.vector", i32, 1, 4) [[TMP8]], i32 2)
14+
; CHECK-NEXT: [[TMP6:%.*]] = call <2 x i32> @xd.read__v2i32()
15+
; CHECK-NEXT: [[TMP7:%.*]] = call target("xd.vector", i32, 1, 2) (...) @xd.fromfixedvector__txd.vector_i32_1_2t(<2 x i32> [[TMP6]])
16+
; CHECK-NEXT: [[TMP8:%.*]] = call target("xd.vector", i32, 1, 4) @xd.read__txd.vector_i32_1_4t()
17+
; CHECK-NEXT: [[TMP9:%.*]] = call i32 (...) @xd.extractelement__i32(target("xd.vector", i32, 1, 4) [[TMP8]], i32 [[TMP0]])
18+
; CHECK-NEXT: [[TMP10:%.*]] = call i32 (...) @xd.extractelement__i32(target("xd.vector", i32, 1, 4) [[TMP8]], i32 2)
1919
; CHECK-NEXT: [[TMP11:%.*]] = add i32 [[TMP9]], [[TMP10]]
20-
; CHECK-NEXT: [[TMP12:%.*]] = call target("xd.vector", i32, 1, 2) (...) @xd.insertelement.txd.vector_i32_1_2t(target("xd.vector", i32, 1, 2) [[TMP7]], i32 [[TMP11]], i32 [[TMP0]])
21-
; CHECK-NEXT: [[TMP13:%.*]] = call target("xd.vector", i32, 1, 2) (...) @xd.insertelement.txd.vector_i32_1_2t(target("xd.vector", i32, 1, 2) [[TMP12]], i32 [[TMP9]], i32 1)
20+
; CHECK-NEXT: [[TMP12:%.*]] = call target("xd.vector", i32, 1, 2) (...) @xd.insertelement__txd.vector_i32_1_2t(target("xd.vector", i32, 1, 2) [[TMP7]], i32 [[TMP11]], i32 [[TMP0]])
21+
; CHECK-NEXT: [[TMP13:%.*]] = call target("xd.vector", i32, 1, 2) (...) @xd.insertelement__txd.vector_i32_1_2t(target("xd.vector", i32, 1, 2) [[TMP12]], i32 [[TMP9]], i32 1)
2222
; CHECK-NEXT: call void (...) @xd.write(target("xd.vector", i32, 1, 2) [[TMP13]])
23-
; CHECK-NEXT: [[P1:%.*]] = call ptr @xd.read.p0()
24-
; CHECK-NEXT: [[P2:%.*]] = call i8 (...) @xd.stream.add.i8(ptr [[P1]], i64 14, i8 0)
23+
; CHECK-NEXT: [[P1:%.*]] = call ptr @xd.read__p0()
24+
; CHECK-NEXT: [[P2:%.*]] = call i8 (...) @xd.stream.add__i8(ptr [[P1]], i64 14, i8 0)
2525
; CHECK-NEXT: call void (...) @xd.write(i8 [[P2]])
2626
; CHECK-NEXT: call void (...) @xd.write.vararg(i8 [[P2]], ptr [[P1]], i8 [[P2]])
2727
; CHECK-NEXT: [[TMP14:%.*]] = call target("xd.handle") @xd.handle.get()
28-
; CHECK-NEXT: [[TMP15:%.*]] = call <2 x i32> @xd.set.read.v2i32()
28+
; CHECK-NEXT: [[TMP15:%.*]] = call <2 x i32> @xd.set.read__v2i32()
2929
; CHECK-NEXT: call void (...) @xd.set.write(target("xd.vector", i32, 1, 2) [[TMP13]])
30-
; CHECK-NEXT: [[TMP16:%.*]] = call [[TMP0]] @xd.read.s_s()
31-
; CHECK-NEXT: [[TMP17:%.*]] = call [[TMP1]] @xd.read.s_s_0()
32-
; CHECK-NEXT: [[TMP18:%.*]] = call [[TMP2]] @xd.read.s_s_1()
30+
; CHECK-NEXT: [[TMP16:%.*]] = call [[TMP0]] @xd.read__s_s()
31+
; CHECK-NEXT: [[TMP17:%.*]] = call [[TMP1]] @xd.read__s_s_0()
32+
; CHECK-NEXT: [[TMP18:%.*]] = call [[TMP2]] @xd.read__s_s_1()
3333
; CHECK-NEXT: call void (...) @xd.write([[TMP0]] [[TMP16]])
3434
; CHECK-NEXT: call void (...) @xd.write([[TMP1]] [[TMP17]])
3535
; CHECK-NEXT: call void (...) @xd.write([[TMP2]] [[TMP18]])

test/example/verifier-basic.ll

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,29 +12,29 @@ entry:
1212
; CHECK: failed check for (le ?:$result_width, ?:$source_width)
1313
; CHECK: with $result_width = 64
1414
; CHECK: with $source_width = 32
15-
%trunc1 = call i64 (...) @xd.itrunc.i64(i32 %sizeof1)
15+
%trunc1 = call i64 (...) @xd.itrunc__i64(i32 %sizeof1)
1616

1717
; CHECK-LABEL: Verifier error in: %fromfixedvector1 =
1818
; CHECK: unexpected value of $scalar_type:
1919
; CHECK: expected: i32
2020
; CHECK: actual: i64
21-
%fromfixedvector1 = call target("xd.vector", i32, 0, 2) (...) @xd.fromfixedvector.txd.vector_i32_0_2t(<2 x i64> poison)
21+
%fromfixedvector1 = call target("xd.vector", i32, 0, 2) (...) @xd.fromfixedvector__txd.vector_i32_0_2t(<2 x i64> poison)
2222

2323
; CHECK-LABEL: Verifier error in: %fromfixedvector2 =
2424
; CHECK: unexpected value of $num_elements:
2525
; CHECK: expected: 2
2626
; CHECK: actual: 4
27-
%fromfixedvector2 = call target("xd.vector", i32, 0, 2) (...) @xd.fromfixedvector.txd.vector_i32_0_2t(<4 x i32> poison)
27+
%fromfixedvector2 = call target("xd.vector", i32, 0, 2) (...) @xd.fromfixedvector__txd.vector_i32_0_2t(<4 x i32> poison)
2828

2929
; CHECK-LABEL: Verifier error in: %stream.max1 =
3030
; CHECK: unexpected value of $result:
3131
; CHECK: expected: i16
3232
; CHECK: actual: <2 x i16>
33-
%stream.max1 = call <2 x i16> (...) @xd.stream.max.v2i16(ptr %p, i64 %trunc1, i16 0)
33+
%stream.max1 = call <2 x i16> (...) @xd.stream.max__v2i16(ptr %p, i64 %trunc1, i16 0)
3434

3535
; CHECK-LABEL: Verifier error in: %stream.min1 =
3636
; CHECK: wrong number of arguments: 2, expected 3
37-
%stream.min1 = call i8 (...) @xd.stream.min.i8(ptr %p, i64 14)
37+
%stream.min1 = call i8 (...) @xd.stream.min__i8(ptr %p, i64 14)
3838

3939
; CHECK-LABEL: Verifier error in: %fromfixedvector3 =
4040
; CHECK: eq:$rhs (MiddleEndian) does not match any available option
@@ -50,14 +50,14 @@ entry:
5050
; CHECK: previously: MiddleEndian
5151
; CHECK: while checking (isReasonableVectorKind ?:$kind)
5252
; CHECK: with $kind = MiddleEndian
53-
%fromfixedvector3 = call target("xd.vector", i32, 2, 2) (...) @xd.fromfixedvector.txd.vector_i32_2_2t(<2 x i32> poison)
53+
%fromfixedvector3 = call target("xd.vector", i32, 2, 2) (...) @xd.fromfixedvector__txd.vector_i32_2_2t(<2 x i32> poison)
5454

5555
ret void
5656
}
5757

5858
declare i32 @xd.sizeof(...)
59-
declare i64 @xd.itrunc.i64(...)
60-
declare target("xd.vector", i32, 0, 2) @xd.fromfixedvector.txd.vector_i32_0_2t(...)
61-
declare target("xd.vector", i32, 2, 2) @xd.fromfixedvector.txd.vector_i32_2_2t(...)
62-
declare <2 x i16> @xd.stream.max.v2i16(...)
63-
declare i8 @xd.stream.min.i8(...)
59+
declare i64 @xd.itrunc__i64(...)
60+
declare target("xd.vector", i32, 0, 2) @xd.fromfixedvector__txd.vector_i32_0_2t(...)
61+
declare target("xd.vector", i32, 2, 2) @xd.fromfixedvector__txd.vector_i32_2_2t(...)
62+
declare <2 x i16> @xd.stream.max__v2i16(...)
63+
declare i8 @xd.stream.min__i8(...)

test/example/visitor-basic.ll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
; RUN: llvm-dialects-example -visit %s | FileCheck --check-prefixes=DEFAULT %s
22

3-
; DEFAULT: visiting ReadOp: %v = call i32 @xd.read.i32()
3+
; DEFAULT: visiting ReadOp: %v = call i32 @xd.read__i32()
44
; DEFAULT-NEXT: visiting UnaryInstruction (pre): %w = load i32, ptr %p
55
; DEFAULT-NEXT: visiting UnaryInstruction (pre): %q = load i32, ptr %p1
66
; DEFAULT-NEXT: visiting BinaryOperator: %v1 = add i32 %v, %w
77
; DEFAULT-NEXT: visiting umax intrinsic: %v2 = call i32 @llvm.umax.i32(i32 %v1, i32 %q)
88
; DEFAULT-NEXT: visiting WriteOp: call void (...) @xd.write(i8 %t)
9-
; DEFAULT-NEXT: visiting SetReadOp: %v.0 = call i1 @xd.set.read.i1()
10-
; DEFAULT-NEXT: visiting SetReadOp: %v.1 = call i32 @xd.set.read.i32()
11-
; DEFAULT-NEXT: visiting SetReadOp (set): %v.1 = call i32 @xd.set.read.i32()
9+
; DEFAULT-NEXT: visiting SetReadOp: %v.0 = call i1 @xd.set.read__i1()
10+
; DEFAULT-NEXT: visiting SetReadOp: %v.1 = call i32 @xd.set.read__i32()
11+
; DEFAULT-NEXT: visiting SetReadOp (set): %v.1 = call i32 @xd.set.read__i32()
1212
; DEFAULT-NEXT: visiting UnaryInstruction (pre): %v.2 = trunc i32 %v.1 to i8
1313
; DEFAULT-NEXT: visiting UnaryInstruction: %v.2 = trunc i32 %v.1 to i8
1414
; DEFAULT-NEXT: visiting SetWriteOp (set): call void (...) @xd.set.write(i8 %v.2)
@@ -22,30 +22,30 @@
2222

2323
define void @test1(ptr %p) {
2424
entry:
25-
%v = call i32 @xd.read.i32()
25+
%v = call i32 @xd.read__i32()
2626
%w = load i32, ptr %p
2727
%p1 = getelementptr i32, ptr %p, i32 1
2828
%q = load i32, ptr %p1
2929
%v1 = add i32 %v, %w
3030
%v2 = call i32 @llvm.umax.i32(i32 %v1, i32 %q)
31-
%t = call i8 (...) @xd.itrunc.i8(i32 %v2)
31+
%t = call i8 (...) @xd.itrunc__i8(i32 %v2)
3232
call void (...) @xd.write(i8 %t)
33-
%v.0 = call i1 @xd.set.read.i1()
34-
%v.1 = call i32 @xd.set.read.i32()
33+
%v.0 = call i1 @xd.set.read__i1()
34+
%v.1 = call i32 @xd.set.read__i32()
3535
%v.2 = trunc i32 %v.1 to i8
3636
call void (...) @xd.set.write(i8 %v.2)
3737
call void (...) @xd.write.vararg(i8 %t, i32 %v2, i32 %q)
3838
%vm = call i32 @llvm.umin.i32(i32 %v1, i32 %q)
3939
ret void
4040
}
4141

42-
declare i32 @xd.read.i32()
43-
declare i1 @xd.set.read.i1()
44-
declare i32 @xd.set.read.i32()
42+
declare i32 @xd.read__i32()
43+
declare i1 @xd.set.read__i1()
44+
declare i32 @xd.set.read__i32()
4545
declare void @xd.write(...)
4646
declare void @xd.set.write(...)
4747
declare void @xd.write.vararg(...)
48-
declare i8 @xd.itrunc.i8(...)
48+
declare i8 @xd.itrunc__i8(...)
4949

5050
declare i32 @llvm.umax.i32(i32, i32)
5151
declare i32 @llvm.umin.i32(i32, i32)

0 commit comments

Comments
 (0)