Index: lib/Target/ARM/AsmParser/ARMAsmParser.cpp =================================================================== --- lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -8721,11 +8721,13 @@ // Returns true if Inst is unpredictable if it is in and IT block, but is not // the last instruction in the block. bool ARMAsmParser::isITBlockTerminator(MCInst &Inst) const { + const MCInstrDesc &MCID = MII.get(Inst.getOpcode()); - // All branch & call instructions terminate IT blocks. - if (MCID.isTerminator() || MCID.isCall() || MCID.isReturn() || - MCID.isBranch() || MCID.isIndirectBranch()) + // All branch & call instructions terminate IT blocks with the exception of + // SVC. + if (MCID.isTerminator() || (MCID.isCall() && Inst.getOpcode() != ARM::tSVC) || + MCID.isReturn() || MCID.isBranch() || MCID.isIndirectBranch()) return true; // Any arithmetic instruction which writes to the PC also terminates the IT Index: test/MC/ARM/basic-thumb2-instructions.s =================================================================== --- test/MC/ARM/basic-thumb2-instructions.s +++ test/MC/ARM/basic-thumb2-instructions.s @@ -3113,12 +3113,18 @@ svceq #255 it ne swine #33 + itt eq + svceq #0 + svceq #1 @ CHECK: svc #0 @ encoding: [0x00,0xdf] @ CHECK: it eq @ encoding: [0x08,0xbf] @ CHECK: svceq #255 @ encoding: [0xff,0xdf] @ CHECK: it ne @ encoding: [0x18,0xbf] @ CHECK: svcne #33 @ encoding: [0x21,0xdf] +@ CHECK: itt eq @ encoding: [0x04,0xbf] +@ CHECK: svceq #0 @ encoding: [0x00,0xdf] +@ CHECK: svceq #1 @ encoding: [0x01,0xdf] @------------------------------------------------------------------------------