summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorAmara Emerson <aemerson@apple.com>2018-01-02 18:56:39 +0000
committerAmara Emerson <aemerson@apple.com>2018-01-02 18:56:39 +0000
commit913918cbefd834ac6565c77c2c8201f0615fe836 (patch)
tree0b3db4fb95f5a48c3b1e2335796e7b366d44b986 /llvm
parent28f1dfcbfe7c549d3919b63173620bcb8ac25ce3 (diff)
downloadbcm5719-llvm-913918cbefd834ac6565c77c2c8201f0615fe836.tar.gz
bcm5719-llvm-913918cbefd834ac6565c77c2c8201f0615fe836.zip
[AArch64][GlobalISel] Fix assert fail with unknown intrinsic.
A call may have an intrinsic name but not have a valid intrinsic ID, for example with llvm.invariant.group.barrier. If so, treat it as a normal call like FastISel does. llvm-svn: 321662
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp13
-rw-r--r--llvm/test/CodeGen/AArch64/GlobalISel/unknown-intrinsic.ll10
2 files changed, 18 insertions, 5 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index 433f99b0113..705d4ded5b5 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -815,7 +815,14 @@ bool IRTranslator::translateCall(const User &U, MachineIRBuilder &MIRBuilder) {
if (CI.isInlineAsm())
return translateInlineAsm(CI, MIRBuilder);
- if (!F || !F->isIntrinsic()) {
+ Intrinsic::ID ID = Intrinsic::not_intrinsic;
+ if (F && F->isIntrinsic()) {
+ ID = F->getIntrinsicID();
+ if (TII && ID == Intrinsic::not_intrinsic)
+ ID = static_cast<Intrinsic::ID>(TII->getIntrinsicID(F));
+ }
+
+ if (!F || !F->isIntrinsic() || ID == Intrinsic::not_intrinsic) {
unsigned Res = CI.getType()->isVoidTy() ? 0 : getOrCreateVReg(CI);
SmallVector<unsigned, 8> Args;
for (auto &Arg: CI.arg_operands())
@@ -827,10 +834,6 @@ bool IRTranslator::translateCall(const User &U, MachineIRBuilder &MIRBuilder) {
});
}
- Intrinsic::ID ID = F->getIntrinsicID();
- if (TII && ID == Intrinsic::not_intrinsic)
- ID = static_cast<Intrinsic::ID>(TII->getIntrinsicID(F));
-
assert(ID != Intrinsic::not_intrinsic && "unknown intrinsic");
if (translateKnownIntrinsic(CI, ID, MIRBuilder))
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/unknown-intrinsic.ll b/llvm/test/CodeGen/AArch64/GlobalISel/unknown-intrinsic.ll
new file mode 100644
index 00000000000..179dd518d3f
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/unknown-intrinsic.ll
@@ -0,0 +1,10 @@
+; RUN: llc -O0 -mtriple=arm64 < %s
+
+declare i8* @llvm.invariant.group.barrier(i8*)
+
+define i8* @barrier(i8* %p) {
+; CHECK: bl llvm.invariant.group.barrier
+ %q = call i8* @llvm.invariant.group.barrier(i8* %p)
+ ret i8* %q
+}
+
OpenPOWER on IntegriCloud