diff options
-rw-r--r-- | llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp | 4 | ||||
-rw-r--r-- | llvm/test/CodeGen/SystemZ/asm-20.ll | 15 |
2 files changed, 17 insertions, 2 deletions
diff --git a/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp b/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp index da71759cc3f..24a234481d3 100644 --- a/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp +++ b/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp @@ -462,8 +462,8 @@ bool SystemZInstrInfo::analyzeBranch(MachineBasicBlock &MBB, break; // A terminator that isn't a branch can't easily be handled by this - // analysis. - if (!I->isBranch()) + // analysis. Asm goto is not understood / optimized. + if (!I->isBranch() || I->getOpcode() == SystemZ::INLINEASM_BR) return true; // Can't handle indirect branches. diff --git a/llvm/test/CodeGen/SystemZ/asm-20.ll b/llvm/test/CodeGen/SystemZ/asm-20.ll new file mode 100644 index 00000000000..402c038f022 --- /dev/null +++ b/llvm/test/CodeGen/SystemZ/asm-20.ll @@ -0,0 +1,15 @@ +; Test that asm goto can be compiled. +; +; RUN: llc < %s -mtriple=s390x-linux-gnu + +define i32 @c() { +entry: + callbr void asm sideeffect "", "X"(i8* blockaddress(@c, %d)) + to label %asm.fallthrough [label %d] + +asm.fallthrough: ; preds = %entry + br label %d + +d: ; preds = %asm.fallthrough, %entry + ret i32 undef +} |