summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoman Tereshin <rtereshin@apple.com>2018-02-28 23:51:49 +0000
committerRoman Tereshin <rtereshin@apple.com>2018-02-28 23:51:49 +0000
commit12a4dc4c34890d7d158ac95a0fb3e63281e596a0 (patch)
tree487cb9846690f48fd90b098b2f73ccd3ea8ab076
parenteb9d944419a6048fdbd20b4d7766552df92b7f2a (diff)
downloadbcm5719-llvm-12a4dc4c34890d7d158ac95a0fb3e63281e596a0.tar.gz
bcm5719-llvm-12a4dc4c34890d7d158ac95a0fb3e63281e596a0.zip
[MIRParser] Accept overloaded intrinsic names w/o type suffixes
Function::lookupIntrinsicID is somewhat forgiving as it comes to overloaded intrinsics' names: it returns an ID as soon as the name provided has a prefix that matches a registered intrinsic's name w/o actually checking that the rest of the name encodes all the concrete arg types, let alone that those types are compatible with the intrinsic's definition. That's probably fine and comes in handy in MIR serialization: we don't care about IR types at MIR level and every intrinsic should be selectable based on its ID and low-level types (LLTs) of its operands, including the overloaded ones, so there is no point in serializing mangled IR types as part of the intrinsic's name. However, lookupIntrinsicID is somewhat inconsistent in its forgiveness: if the name provided is actually an exact match, it will refuse to return the ID if the intrinsic is overloaded. There is probably no real reason for that and it renders MIRParser incapable to deserialize MIR MIRPrinter serialized. This commit fixes it. Reviewers: rnk, aditya_nandakumar, qcolombet, thegameg, dsanders, marcello.maggioni Reviewed By: bogner Subscribers: javed.absar, llvm-commits Differential Revision: https://reviews.llvm.org/D43267 llvm-svn: 326387
-rw-r--r--llvm/lib/IR/Function.cpp8
-rw-r--r--llvm/test/CodeGen/MIR/AArch64/print-parse-overloaded-intrinsics.mir24
2 files changed, 29 insertions, 3 deletions
diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp
index 24f2f3bab88..4b0124c3539 100644
--- a/llvm/lib/IR/Function.cpp
+++ b/llvm/lib/IR/Function.cpp
@@ -523,9 +523,11 @@ Intrinsic::ID Function::lookupIntrinsicID(StringRef Name) {
Intrinsic::ID ID = static_cast<Intrinsic::ID>(Idx + Adjust);
// If the intrinsic is not overloaded, require an exact match. If it is
- // overloaded, require a prefix match.
- bool IsPrefixMatch = Name.size() > strlen(NameTable[Idx]);
- return IsPrefixMatch == isOverloaded(ID) ? ID : Intrinsic::not_intrinsic;
+ // overloaded, require either exact or prefix match.
+ const auto MatchSize = strlen(NameTable[Idx]);
+ assert(Name.size() >= MatchSize && "Expected either exact or prefix match");
+ bool IsExactMatch = Name.size() == MatchSize;
+ return IsExactMatch || isOverloaded(ID) ? ID : Intrinsic::not_intrinsic;
}
void Function::recalculateIntrinsicID() {
diff --git a/llvm/test/CodeGen/MIR/AArch64/print-parse-overloaded-intrinsics.mir b/llvm/test/CodeGen/MIR/AArch64/print-parse-overloaded-intrinsics.mir
new file mode 100644
index 00000000000..9a014e0cce5
--- /dev/null
+++ b/llvm/test/CodeGen/MIR/AArch64/print-parse-overloaded-intrinsics.mir
@@ -0,0 +1,24 @@
+# RUN: llc -mtriple aarch64-- -run-pass irtranslator -simplify-mir %s -o %t \
+# RUN: -verify-machineinstrs; llc -mtriple aarch64-- -run-pass legalizer \
+# RUN: -simplify-mir %t -x mir -o - -verify-machineinstrs | FileCheck %s
+
+# Test that MIRParser is able to deserialize back MIR MIRPrinter serialized,
+# specifically overloaded intrinsic names in this case which aren't required
+# to encode all the concrete arg types in the name at MIR level.
+
+--- |
+ define i32 @int_aarch64_sdiv(i32 %a, i32 %b) nounwind readnone ssp {
+ ; CHECK-LABEL: name: int_aarch64_sdiv
+ ; CHECK: liveins: $w0, $w1
+ ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
+ ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
+ ; CHECK: [[INT:%[0-9]+]]:_(s32) = G_INTRINSIC intrinsic(@llvm.aarch64.sdiv), [[COPY]](s32), [[COPY1]](s32)
+ ; CHECK: $w0 = COPY [[INT]](s32)
+ ; CHECK: RET_ReallyLR implicit $w0
+ entry:
+ %sdiv = call i32 @llvm.aarch64.sdiv.i32(i32 %a, i32 %b)
+ ret i32 %sdiv
+ }
+
+ declare i32 @llvm.aarch64.sdiv.i32(i32, i32) nounwind readnone
+...
OpenPOWER on IntegriCloud