<div dir="ltr">I am going to revert this CL as it breaks <div><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/3607/steps/check-llvm%20ubsan/logs/stdio">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/3607/steps/check-llvm%20ubsan/logs/stdio</a><br></div><div><br></div><div><pre style="font-family:"courier new",courier,monotype,monospace;font-size:medium"><span class="inbox-inbox-stdout">Command Output (stderr):
--
lib/Target/ARM/ARMGenDAGISel.inc:37405:19: runtime error: negation of -2147483648 cannot be represented in type 'int'; cast to an unsigned type to negate this value to itself
    #0 0xfebe1e in (anonymous namespace)::ARMDAGToDAGISel::CheckNodePredicate(llvm::SDNode*, unsigned int) const /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm_build_ubsan/lib/Target/ARM/ARMGenDAGISel.inc:37405:19
    #1 0x2cb2f50 in CheckNodePredicate(unsigned char const*, unsigned int&, llvm::SelectionDAGISel const&, llvm::SDNode*) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:2724:17
    #2 0x2cb2f50 in llvm::SelectionDAGISel::SelectCodeCommon(llvm::SDNode*, unsigned char const*, unsigned int) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:3225
    #3 0xfe3a20 in (anonymous namespace)::ARMDAGToDAGISel::Select(llvm::SDNode*) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:3791:3
    #4 0x2ca94a4 in llvm::SelectionDAGISel::DoInstructionSelection() /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1078:7
    #5 0x2ca80c0 in llvm::SelectionDAGISel::CodeGenAndEmitDAG() /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:916:5
    #6 0x2ca6d08 in llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void>, false, true>, llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void>, false, true>, bool&) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:727:3
    #7 0x2ca6196 in llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1689:7
    #8 0x2ca3317 in llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:542:3
    #9 0xfddcd2 in (anonymous namespace)::ARMDAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:69:23
    #10 0x20fd80f in llvm::MachineFunctionPass::runOnFunction(llvm::Function&) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/CodeGen/MachineFunctionPass.cpp:62:13
    #11 0x26070de in llvm::FPPassManager::runOnFunction(llvm::Function&) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/IR/LegacyPassManager.cpp:1513:27
    #12 0x26074bb in llvm::FPPassManager::runOnModule(llvm::Module&) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/IR/LegacyPassManager.cpp:1534:16
    #13 0x2607f33 in (anonymous namespace)::MPPassManager::runOnModule(llvm::Module&) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/IR/LegacyPassManager.cpp:1590:27
    #14 0x26078f3 in llvm::legacy::PassManagerImpl::run(llvm::Module&) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/IR/LegacyPassManager.cpp:1693:44
    #15 0x9f09f8 in compileModule(char**, llvm::LLVMContext&) /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llc/llc.cpp:577:8
    #16 0x9ef5ba in main /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llc/llc.cpp:331:22
    #17 0x7f81988d782f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
    #18 0x9c7b18 in _start (/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm_build_ubsan/bin/llc+0x9c7b18)

/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/test/CodeGen/Thumb/long.ll:142:16: error: expected string not found in input
; CHECK-LABEL: f9d:
               ^
<stdin>:228:2: note: scanning from here
 </span></pre></div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Mar 21, 2017 at 11:51 AM Artyom Skrobov via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: askrobov<br class="gmail_msg">
Date: Tue Mar 21 13:39:41 2017<br class="gmail_msg">
New Revision: 298417<br class="gmail_msg">
<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=298417&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=298417&view=rev</a><br class="gmail_msg">
Log:<br class="gmail_msg">
[ARM] Recommit the glueless lowering of addc/adde in Thumb1,<br class="gmail_msg">
including the amended (no UB anymore) fix for adding/subtracting -<a href="tel:(214)%20748-3648" value="+12147483648" class="gmail_msg" target="_blank">2147483648</a>.<br class="gmail_msg">
<br class="gmail_msg">
This reverts r298328 "[ARM] Revert r297443 and r297820."<br class="gmail_msg">
and partially reverts r297842 "Revert "[Thumb1] Fix the bug when adding/subtracting -<a href="tel:(214)%20748-3648" value="+12147483648" class="gmail_msg" target="_blank">2147483648</a>""<br class="gmail_msg">
<br class="gmail_msg">
Modified:<br class="gmail_msg">
    llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp<br class="gmail_msg">
    llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp<br class="gmail_msg">
    llvm/trunk/lib/Target/ARM/ARMInstrThumb.td<br class="gmail_msg">
    llvm/trunk/test/CodeGen/Thumb/long.ll<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp?rev=298417&r1=298416&r2=298417&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp?rev=298417&r1=298416&r2=298417&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp Tue Mar 21 13:39:41 2017<br class="gmail_msg">
@@ -2028,6 +2028,16 @@ static const AddSubFlagsOpcodePair AddSu<br class="gmail_msg">
   {ARM::RSBSrsi, ARM::RSBrsi},<br class="gmail_msg">
   {ARM::RSBSrsr, ARM::RSBrsr},<br class="gmail_msg">
<br class="gmail_msg">
+  {ARM::tADDSi3, ARM::tADDi3},<br class="gmail_msg">
+  {ARM::tADDSi8, ARM::tADDi8},<br class="gmail_msg">
+  {ARM::tADDSrr, ARM::tADDrr},<br class="gmail_msg">
+  {ARM::tADCS, ARM::tADC},<br class="gmail_msg">
+<br class="gmail_msg">
+  {ARM::tSUBSi3, ARM::tSUBi3},<br class="gmail_msg">
+  {ARM::tSUBSi8, ARM::tSUBi8},<br class="gmail_msg">
+  {ARM::tSUBSrr, ARM::tSUBrr},<br class="gmail_msg">
+  {ARM::tSBCS, ARM::tSBC},<br class="gmail_msg">
+<br class="gmail_msg">
   {ARM::t2ADDSri, ARM::t2ADDri},<br class="gmail_msg">
   {ARM::t2ADDSrr, ARM::t2ADDrr},<br class="gmail_msg">
   {ARM::t2ADDSrs, ARM::t2ADDrs},<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=298417&r1=298416&r2=298417&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=298417&r1=298416&r2=298417&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Tue Mar 21 13:39:41 2017<br class="gmail_msg">
@@ -822,13 +822,10 @@ ARMTargetLowering::ARMTargetLowering(con<br class="gmail_msg">
   setOperationAction(ISD::SRL,       MVT::i64, Custom);<br class="gmail_msg">
   setOperationAction(ISD::SRA,       MVT::i64, Custom);<br class="gmail_msg">
<br class="gmail_msg">
-  if (!Subtarget->isThumb1Only()) {<br class="gmail_msg">
-    // FIXME: We should do this for Thumb1 as well.<br class="gmail_msg">
-    setOperationAction(ISD::ADDC,    MVT::i32, Custom);<br class="gmail_msg">
-    setOperationAction(ISD::ADDE,    MVT::i32, Custom);<br class="gmail_msg">
-    setOperationAction(ISD::SUBC,    MVT::i32, Custom);<br class="gmail_msg">
-    setOperationAction(ISD::SUBE,    MVT::i32, Custom);<br class="gmail_msg">
-  }<br class="gmail_msg">
+  setOperationAction(ISD::ADDC,      MVT::i32, Custom);<br class="gmail_msg">
+  setOperationAction(ISD::ADDE,      MVT::i32, Custom);<br class="gmail_msg">
+  setOperationAction(ISD::SUBC,      MVT::i32, Custom);<br class="gmail_msg">
+  setOperationAction(ISD::SUBE,      MVT::i32, Custom);<br class="gmail_msg">
<br class="gmail_msg">
   if (!Subtarget->isThumb1Only() && Subtarget->hasV6T2Ops())<br class="gmail_msg">
     setOperationAction(ISD::BITREVERSE, MVT::i32, Legal);<br class="gmail_msg">
@@ -9096,19 +9093,45 @@ void ARMTargetLowering::AdjustInstrPostI<br class="gmail_msg">
<br class="gmail_msg">
   // Rename pseudo opcodes.<br class="gmail_msg">
   unsigned NewOpc = convertAddSubFlagsOpcode(MI.getOpcode());<br class="gmail_msg">
+  unsigned ccOutIdx;<br class="gmail_msg">
   if (NewOpc) {<br class="gmail_msg">
     const ARMBaseInstrInfo *TII = Subtarget->getInstrInfo();<br class="gmail_msg">
     MCID = &TII->get(NewOpc);<br class="gmail_msg">
<br class="gmail_msg">
-    assert(MCID->getNumOperands() == MI.getDesc().getNumOperands() + 1 &&<br class="gmail_msg">
-           "converted opcode should be the same except for cc_out");<br class="gmail_msg">
+    assert(MCID->getNumOperands() ==<br class="gmail_msg">
+           MI.getDesc().getNumOperands() + 5 - MI.getDesc().getSize()<br class="gmail_msg">
+        && "converted opcode should be the same except for cc_out"<br class="gmail_msg">
+           " (and, on Thumb1, pred)");<br class="gmail_msg">
<br class="gmail_msg">
     MI.setDesc(*MCID);<br class="gmail_msg">
<br class="gmail_msg">
     // Add the optional cc_out operand<br class="gmail_msg">
     MI.addOperand(MachineOperand::CreateReg(0, /*isDef=*/true));<br class="gmail_msg">
-  }<br class="gmail_msg">
-  unsigned ccOutIdx = MCID->getNumOperands() - 1;<br class="gmail_msg">
+<br class="gmail_msg">
+    // On Thumb1, move all input operands to the end, then add the predicate<br class="gmail_msg">
+    if (Subtarget->isThumb1Only()) {<br class="gmail_msg">
+      for (unsigned c = MCID->getNumOperands() - 4; c--;) {<br class="gmail_msg">
+        MI.addOperand(MI.getOperand(1));<br class="gmail_msg">
+        MI.RemoveOperand(1);<br class="gmail_msg">
+      }<br class="gmail_msg">
+<br class="gmail_msg">
+      // Restore the ties<br class="gmail_msg">
+      for (unsigned i = MI.getNumOperands(); i--;) {<br class="gmail_msg">
+        const MachineOperand& op = MI.getOperand(i);<br class="gmail_msg">
+        if (op.isReg() && op.isUse()) {<br class="gmail_msg">
+          int DefIdx = MCID->getOperandConstraint(i, MCOI::TIED_TO);<br class="gmail_msg">
+          if (DefIdx != -1)<br class="gmail_msg">
+            MI.tieOperands(DefIdx, i);<br class="gmail_msg">
+        }<br class="gmail_msg">
+      }<br class="gmail_msg">
+<br class="gmail_msg">
+      MI.addOperand(MachineOperand::CreateImm(ARMCC::AL));<br class="gmail_msg">
+      MI.addOperand(MachineOperand::CreateReg(0, /*isDef=*/false));<br class="gmail_msg">
+      ccOutIdx = 1;<br class="gmail_msg">
+    } else<br class="gmail_msg">
+      ccOutIdx = MCID->getNumOperands() - 1;<br class="gmail_msg">
+  } else<br class="gmail_msg">
+    ccOutIdx = MCID->getNumOperands() - 1;<br class="gmail_msg">
<br class="gmail_msg">
   // Any ARM instruction that sets the 's' bit should specify an optional<br class="gmail_msg">
   // "cc_out" operand in the last operand position.<br class="gmail_msg">
@@ -9139,7 +9162,9 @@ void ARMTargetLowering::AdjustInstrPostI<br class="gmail_msg">
   if (deadCPSR) {<br class="gmail_msg">
     assert(!MI.getOperand(ccOutIdx).getReg() &&<br class="gmail_msg">
            "expect uninitialized optional cc_out operand");<br class="gmail_msg">
-    return;<br class="gmail_msg">
+    // Thumb1 instructions must have the S bit even if the CPSR is dead.<br class="gmail_msg">
+    if (!Subtarget->isThumb1Only())<br class="gmail_msg">
+      return;<br class="gmail_msg">
   }<br class="gmail_msg">
<br class="gmail_msg">
   // If this instruction was defined with an optional CPSR def and its dag node<br class="gmail_msg">
@@ -9759,6 +9784,48 @@ static SDValue PerformUMLALCombine(SDNod<br class="gmail_msg">
     return SDValue();<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
+static SDValue PerformAddcSubcCombine(SDNode *N, SelectionDAG &DAG,<br class="gmail_msg">
+                                      const ARMSubtarget *Subtarget) {<br class="gmail_msg">
+  if (Subtarget->isThumb1Only()) {<br class="gmail_msg">
+    SDValue RHS = N->getOperand(1);<br class="gmail_msg">
+    if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(RHS)) {<br class="gmail_msg">
+      int32_t imm = C->getSExtValue();<br class="gmail_msg">
+      if (imm < 0 && imm > -<a href="tel:(214)%20748-3648" value="+12147483648" class="gmail_msg" target="_blank">2147483648</a>) {<br class="gmail_msg">
+        SDLoc DL(N);<br class="gmail_msg">
+        RHS = DAG.getConstant(-imm, DL, MVT::i32);<br class="gmail_msg">
+        unsigned Opcode = (N->getOpcode() == ARMISD::ADDC) ? ARMISD::SUBC<br class="gmail_msg">
+                                                           : ARMISD::ADDC;<br class="gmail_msg">
+        return DAG.getNode(Opcode, DL, N->getVTList(), N->getOperand(0), RHS);<br class="gmail_msg">
+      }<br class="gmail_msg">
+    }<br class="gmail_msg">
+  }<br class="gmail_msg">
+  return SDValue();<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+static SDValue PerformAddeSubeCombine(SDNode *N, SelectionDAG &DAG,<br class="gmail_msg">
+                                      const ARMSubtarget *Subtarget) {<br class="gmail_msg">
+  if (Subtarget->isThumb1Only()) {<br class="gmail_msg">
+    SDValue RHS = N->getOperand(1);<br class="gmail_msg">
+    if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(RHS)) {<br class="gmail_msg">
+      int64_t imm = C->getSExtValue();<br class="gmail_msg">
+      if (imm < 0) {<br class="gmail_msg">
+        SDLoc DL(N);<br class="gmail_msg">
+<br class="gmail_msg">
+        // The with-carry-in form matches bitwise not instead of the negation.<br class="gmail_msg">
+        // Effectively, the inverse interpretation of the carry flag already<br class="gmail_msg">
+        // accounts for part of the negation.<br class="gmail_msg">
+        RHS = DAG.getConstant(~imm, DL, MVT::i32);<br class="gmail_msg">
+<br class="gmail_msg">
+        unsigned Opcode = (N->getOpcode() == ARMISD::ADDE) ? ARMISD::SUBE<br class="gmail_msg">
+                                                           : ARMISD::ADDE;<br class="gmail_msg">
+        return DAG.getNode(Opcode, DL, N->getVTList(),<br class="gmail_msg">
+                           N->getOperand(0), RHS, N->getOperand(2));<br class="gmail_msg">
+      }<br class="gmail_msg">
+    }<br class="gmail_msg">
+  }<br class="gmail_msg">
+  return SDValue();<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
 /// PerformADDECombine - Target-specific dag combine transform from<br class="gmail_msg">
 /// ARMISD::ADDC, ARMISD::ADDE, and ISD::MUL_LOHI to MLAL or<br class="gmail_msg">
 /// ARMISD::ADDC, ARMISD::ADDE and ARMISD::UMLAL to ARMISD::UMAAL<br class="gmail_msg">
@@ -9767,7 +9834,7 @@ static SDValue PerformADDECombine(SDNode<br class="gmail_msg">
                                   const ARMSubtarget *Subtarget) {<br class="gmail_msg">
   // Only ARM and Thumb2 support UMLAL/SMLAL.<br class="gmail_msg">
   if (Subtarget->isThumb1Only())<br class="gmail_msg">
-    return SDValue();<br class="gmail_msg">
+    return PerformAddeSubeCombine(N, DCI.DAG, Subtarget);<br class="gmail_msg">
<br class="gmail_msg">
   // Only perform the checks after legalize when the pattern is available.<br class="gmail_msg">
   if (DCI.isBeforeLegalize()) return SDValue();<br class="gmail_msg">
@@ -11867,6 +11934,9 @@ SDValue ARMTargetLowering::PerformDAGCom<br class="gmail_msg">
   case ISD::OR:         return PerformORCombine(N, DCI, Subtarget);<br class="gmail_msg">
   case ISD::XOR:        return PerformXORCombine(N, DCI, Subtarget);<br class="gmail_msg">
   case ISD::AND:        return PerformANDCombine(N, DCI, Subtarget);<br class="gmail_msg">
+  case ARMISD::ADDC:<br class="gmail_msg">
+  case ARMISD::SUBC:    return PerformAddcSubcCombine(N, DCI.DAG, Subtarget);<br class="gmail_msg">
+  case ARMISD::SUBE:    return PerformAddeSubeCombine(N, DCI.DAG, Subtarget);<br class="gmail_msg">
   case ARMISD::BFI:     return PerformBFICombine(N, DCI);<br class="gmail_msg">
   case ARMISD::VMOVRRD: return PerformVMOVRRDCombine(N, DCI, Subtarget);<br class="gmail_msg">
   case ARMISD::VMOVDRR: return PerformVMOVDRRCombine(N, DCI.DAG);<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=298417&r1=298416&r2=298417&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=298417&r1=298416&r2=298417&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original)<br class="gmail_msg">
+++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Tue Mar 21 13:39:41 2017<br class="gmail_msg">
@@ -922,7 +922,7 @@ let isAdd = 1 in {<br class="gmail_msg">
   def tADC :                      // A8.6.2<br class="gmail_msg">
     T1sItDPEncode<0b0101, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iALUr,<br class="gmail_msg">
                   "adc", "\t$Rdn, $Rm",<br class="gmail_msg">
-                  [(set tGPR:$Rdn, (adde tGPR:$Rn, tGPR:$Rm))]>, Sched<[WriteALU]>;<br class="gmail_msg">
+                  []>, Sched<[WriteALU]>;<br class="gmail_msg">
<br class="gmail_msg">
   // Add immediate<br class="gmail_msg">
   def tADDi3 :                    // A8.6.4 T1<br class="gmail_msg">
@@ -950,6 +950,43 @@ let isAdd = 1 in {<br class="gmail_msg">
                   "add", "\t$Rd, $Rn, $Rm",<br class="gmail_msg">
                   [(set tGPR:$Rd, (add tGPR:$Rn, tGPR:$Rm))]>, Sched<[WriteALU]>;<br class="gmail_msg">
<br class="gmail_msg">
+  /// Similar to the above except these set the 's' bit so the<br class="gmail_msg">
+  /// instruction modifies the CPSR register.<br class="gmail_msg">
+  ///<br class="gmail_msg">
+  /// These opcodes will be converted to the real non-S opcodes by<br class="gmail_msg">
+  /// AdjustInstrPostInstrSelection after giving then an optional CPSR operand.<br class="gmail_msg">
+  let hasPostISelHook = 1, Defs = [CPSR] in {<br class="gmail_msg">
+    let isCommutable = 1 in<br class="gmail_msg">
+    def tADCS : tPseudoInst<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm),<br class="gmail_msg">
+                            2, IIC_iALUr,<br class="gmail_msg">
+                            [(set tGPR:$Rdn, CPSR, (ARMadde tGPR:$Rn, tGPR:$Rm,<br class="gmail_msg">
+                                                            CPSR))]>,<br class="gmail_msg">
+                Requires<[IsThumb1Only]>,<br class="gmail_msg">
+                Sched<[WriteALU]>;<br class="gmail_msg">
+<br class="gmail_msg">
+    def tADDSi3 : tPseudoInst<(outs tGPR:$Rd), (ins tGPR:$Rm, imm0_7:$imm3),<br class="gmail_msg">
+                              2, IIC_iALUi,<br class="gmail_msg">
+                              [(set tGPR:$Rd, CPSR, (ARMaddc tGPR:$Rm,<br class="gmail_msg">
+                                                             imm0_7:$imm3))]>,<br class="gmail_msg">
+                  Requires<[IsThumb1Only]>,<br class="gmail_msg">
+                  Sched<[WriteALU]>;<br class="gmail_msg">
+<br class="gmail_msg">
+    def tADDSi8 : tPseudoInst<(outs tGPR:$Rdn), (ins tGPR:$Rn, imm0_255:$imm8),<br class="gmail_msg">
+                              2, IIC_iALUi,<br class="gmail_msg">
+                              [(set tGPR:$Rdn, CPSR, (ARMaddc tGPR:$Rn,<br class="gmail_msg">
+                                                      imm8_255:$imm8))]>,<br class="gmail_msg">
+                  Requires<[IsThumb1Only]>,<br class="gmail_msg">
+                  Sched<[WriteALU]>;<br class="gmail_msg">
+<br class="gmail_msg">
+    let isCommutable = 1 in<br class="gmail_msg">
+    def tADDSrr : tPseudoInst<(outs tGPR:$Rd), (ins tGPR:$Rn, tGPR:$Rm),<br class="gmail_msg">
+                              2, IIC_iALUr,<br class="gmail_msg">
+                              [(set tGPR:$Rd, CPSR, (ARMaddc tGPR:$Rn,<br class="gmail_msg">
+                                                             tGPR:$Rm))]>,<br class="gmail_msg">
+                  Requires<[IsThumb1Only]>,<br class="gmail_msg">
+                  Sched<[WriteALU]>;<br class="gmail_msg">
+  }<br class="gmail_msg">
+<br class="gmail_msg">
   let hasSideEffects = 0 in<br class="gmail_msg">
   def tADDhirr : T1pIt<(outs GPR:$Rdn), (ins GPR:$Rn, GPR:$Rm), IIC_iALUr,<br class="gmail_msg">
                        "add", "\t$Rdn, $Rm", []>,<br class="gmail_msg">
@@ -1215,7 +1252,7 @@ def tSBC :                      // A8.6.<br class="gmail_msg">
   T1sItDPEncode<0b0110, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm),<br class="gmail_msg">
                 IIC_iALUr,<br class="gmail_msg">
                 "sbc", "\t$Rdn, $Rm",<br class="gmail_msg">
-                [(set tGPR:$Rdn, (sube tGPR:$Rn, tGPR:$Rm))]>,<br class="gmail_msg">
+                []>,<br class="gmail_msg">
                 Sched<[WriteALU]>;<br class="gmail_msg">
<br class="gmail_msg">
 // Subtract immediate<br class="gmail_msg">
@@ -1252,6 +1289,41 @@ def tSUBrr :                    // A8.6.<br class="gmail_msg">
                 [(set tGPR:$Rd, (sub tGPR:$Rn, tGPR:$Rm))]>,<br class="gmail_msg">
                 Sched<[WriteALU]>;<br class="gmail_msg">
<br class="gmail_msg">
+/// Similar to the above except these set the 's' bit so the<br class="gmail_msg">
+/// instruction modifies the CPSR register.<br class="gmail_msg">
+///<br class="gmail_msg">
+/// These opcodes will be converted to the real non-S opcodes by<br class="gmail_msg">
+/// AdjustInstrPostInstrSelection after giving then an optional CPSR operand.<br class="gmail_msg">
+let hasPostISelHook = 1, Defs = [CPSR] in {<br class="gmail_msg">
+  def tSBCS : tPseudoInst<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm),<br class="gmail_msg">
+                          2, IIC_iALUr,<br class="gmail_msg">
+                          [(set tGPR:$Rdn, CPSR, (ARMsube tGPR:$Rn, tGPR:$Rm,<br class="gmail_msg">
+                                                          CPSR))]>,<br class="gmail_msg">
+              Requires<[IsThumb1Only]>,<br class="gmail_msg">
+              Sched<[WriteALU]>;<br class="gmail_msg">
+<br class="gmail_msg">
+  def tSUBSi3 : tPseudoInst<(outs tGPR:$Rd), (ins tGPR:$Rm, imm0_7:$imm3),<br class="gmail_msg">
+                            2, IIC_iALUi,<br class="gmail_msg">
+                            [(set tGPR:$Rd, CPSR, (ARMsubc tGPR:$Rm,<br class="gmail_msg">
+                                                           imm0_7:$imm3))]>,<br class="gmail_msg">
+                Requires<[IsThumb1Only]>,<br class="gmail_msg">
+                Sched<[WriteALU]>;<br class="gmail_msg">
+<br class="gmail_msg">
+  def tSUBSi8 : tPseudoInst<(outs tGPR:$Rdn), (ins tGPR:$Rn, imm0_255:$imm8),<br class="gmail_msg">
+                            2, IIC_iALUi,<br class="gmail_msg">
+                            [(set tGPR:$Rdn, CPSR, (ARMsubc tGPR:$Rn,<br class="gmail_msg">
+                                                            imm8_255:$imm8))]>,<br class="gmail_msg">
+                Requires<[IsThumb1Only]>,<br class="gmail_msg">
+                Sched<[WriteALU]>;<br class="gmail_msg">
+<br class="gmail_msg">
+  def tSUBSrr : tPseudoInst<(outs tGPR:$Rd), (ins tGPR:$Rn, tGPR:$Rm),<br class="gmail_msg">
+                            2, IIC_iALUr,<br class="gmail_msg">
+                            [(set tGPR:$Rd, CPSR, (ARMsubc tGPR:$Rn,<br class="gmail_msg">
+                                                           tGPR:$Rm))]>,<br class="gmail_msg">
+                Requires<[IsThumb1Only]>,<br class="gmail_msg">
+                Sched<[WriteALU]>;<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
 // Sign-extend byte<br class="gmail_msg">
 def tSXTB :                     // A8.6.222<br class="gmail_msg">
   T1pIMiscEncode<{0,0,1,0,0,1,?}, (outs tGPR:$Rd), (ins tGPR:$Rm),<br class="gmail_msg">
@@ -1412,22 +1484,6 @@ def : T1Pat<(ARMcmpZ tGPR:$Rn, imm0_255:<br class="gmail_msg">
 def : T1Pat<(ARMcmpZ tGPR:$Rn, tGPR:$Rm),<br class="gmail_msg">
             (tCMPr   tGPR:$Rn, tGPR:$Rm)>;<br class="gmail_msg">
<br class="gmail_msg">
-// Add with carry<br class="gmail_msg">
-def : T1Pat<(addc   tGPR:$lhs, imm0_7:$rhs),<br class="gmail_msg">
-            (tADDi3 tGPR:$lhs, imm0_7:$rhs)>;<br class="gmail_msg">
-def : T1Pat<(addc   tGPR:$lhs, imm8_255:$rhs),<br class="gmail_msg">
-            (tADDi8 tGPR:$lhs, imm8_255:$rhs)>;<br class="gmail_msg">
-def : T1Pat<(addc   tGPR:$lhs, tGPR:$rhs),<br class="gmail_msg">
-            (tADDrr tGPR:$lhs, tGPR:$rhs)>;<br class="gmail_msg">
-<br class="gmail_msg">
-// Subtract with carry<br class="gmail_msg">
-def : T1Pat<(addc   tGPR:$lhs, imm0_7_neg:$rhs),<br class="gmail_msg">
-            (tSUBi3 tGPR:$lhs, imm0_7_neg:$rhs)>;<br class="gmail_msg">
-def : T1Pat<(addc   tGPR:$lhs, imm8_255_neg:$rhs),<br class="gmail_msg">
-            (tSUBi8 tGPR:$lhs, imm8_255_neg:$rhs)>;<br class="gmail_msg">
-def : T1Pat<(subc   tGPR:$lhs, tGPR:$rhs),<br class="gmail_msg">
-            (tSUBrr tGPR:$lhs, tGPR:$rhs)>;<br class="gmail_msg">
-<br class="gmail_msg">
 // Bswap 16 with load/store<br class="gmail_msg">
 def : T1Pat<(srl (bswap (extloadi16 t_addrmode_is2:$addr)), (i32 16)),<br class="gmail_msg">
             (tREV16 (tLDRHi t_addrmode_is2:$addr))>;<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/test/CodeGen/Thumb/long.ll<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Thumb/long.ll?rev=298417&r1=298416&r2=298417&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Thumb/long.ll?rev=298417&r1=298416&r2=298417&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/test/CodeGen/Thumb/long.ll (original)<br class="gmail_msg">
+++ llvm/trunk/test/CodeGen/Thumb/long.ll Tue Mar 21 13:39:41 2017<br class="gmail_msg">
@@ -1,33 +1,47 @@<br class="gmail_msg">
-; RUN: llc -mtriple=thumb-eabi %s -o - | FileCheck %s<br class="gmail_msg">
-; RUN: llc -mtriple=thumb-apple-darwin %s -o - | \<br class="gmail_msg">
+; RUN: llc -mtriple=thumb-eabi %s -verify-machineinstrs -o - | FileCheck %s<br class="gmail_msg">
+; RUN: llc -mtriple=thumb-apple-darwin %s -verify-machineinstrs -o - | \<br class="gmail_msg">
 ; RUN:    FileCheck %s -check-prefix CHECK -check-prefix CHECK-DARWIN<br class="gmail_msg">
<br class="gmail_msg">
 define i64 @f1() {<br class="gmail_msg">
 entry:<br class="gmail_msg">
         ret i64 0<br class="gmail_msg">
+; CHECK-LABEL: f1:<br class="gmail_msg">
+; CHECK: movs r0, #0<br class="gmail_msg">
+; CHECK: movs r1, r0<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
 define i64 @f2() {<br class="gmail_msg">
 entry:<br class="gmail_msg">
         ret i64 1<br class="gmail_msg">
+; CHECK-LABEL: f2:<br class="gmail_msg">
+; CHECK: movs r0, #1<br class="gmail_msg">
+; CHECK: movs r1, #0<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
 define i64 @f3() {<br class="gmail_msg">
 entry:<br class="gmail_msg">
         ret i64 <a href="tel:(214)%20748-3647" value="+12147483647" class="gmail_msg" target="_blank">2147483647</a><br class="gmail_msg">
+; CHECK-LABEL: f3:<br class="gmail_msg">
+; CHECK: ldr r0,<br class="gmail_msg">
+; CHECK: movs r1, #0<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
 define i64 @f4() {<br class="gmail_msg">
 entry:<br class="gmail_msg">
         ret i64 <a href="tel:(214)%20748-3648" value="+12147483648" class="gmail_msg" target="_blank">2147483648</a><br class="gmail_msg">
+; CHECK-LABEL: f4:<br class="gmail_msg">
+; CHECK: movs r0, #1<br class="gmail_msg">
+; CHECK: lsls r0, r0, #31<br class="gmail_msg">
+; CHECK: movs r1, #0<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
 define i64 @f5() {<br class="gmail_msg">
 entry:<br class="gmail_msg">
         ret i64 9223372036854775807<br class="gmail_msg">
 ; CHECK-LABEL: f5:<br class="gmail_msg">
-; CHECK: mvn<br class="gmail_msg">
-; CHECK-NOT: mvn<br class="gmail_msg">
+; CHECK: movs r0, #0<br class="gmail_msg">
+; CHECK: mvns r0, r0<br class="gmail_msg">
+; CHECK: ldr r1,<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
 define i64 @f6(i64 %x, i64 %y) {<br class="gmail_msg">
@@ -35,14 +49,40 @@ entry:<br class="gmail_msg">
         %tmp1 = add i64 %y, 1           ; <i64> [#uses=1]<br class="gmail_msg">
         ret i64 %tmp1<br class="gmail_msg">
 ; CHECK-LABEL: f6:<br class="gmail_msg">
-; CHECK: adc<br class="gmail_msg">
-; CHECK-NOT: adc<br class="gmail_msg">
+; CHECK: movs r1, #0<br class="gmail_msg">
+; CHECK: adds r0, r2, #1<br class="gmail_msg">
+; CHECK: adcs r1, r3<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+define i64 @f6a(i64 %x, i64 %y) {<br class="gmail_msg">
+entry:<br class="gmail_msg">
+        %tmp1 = add i64 %y, 10<br class="gmail_msg">
+        ret i64 %tmp1<br class="gmail_msg">
+; CHECK-LABEL: f6a:<br class="gmail_msg">
+; CHECK: movs r1, #0<br class="gmail_msg">
+; CHECK: adds r2, #10<br class="gmail_msg">
+; CHECK: adcs r1, r3<br class="gmail_msg">
+; CHECK: movs r0, r2<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+define i64 @f6b(i64 %x, i64 %y) {<br class="gmail_msg">
+entry:<br class="gmail_msg">
+        %tmp1 = add i64 %y, 1000<br class="gmail_msg">
+        ret i64 %tmp1<br class="gmail_msg">
+; CHECK-LABEL: f6b:<br class="gmail_msg">
+; CHECK: movs r0, #125<br class="gmail_msg">
+; CHECK: lsls r0, r0, #3<br class="gmail_msg">
+; CHECK: movs r1, #0<br class="gmail_msg">
+; CHECK: adds r0, r2, r0<br class="gmail_msg">
+; CHECK: adcs r1, r3<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
 define void @f7() {<br class="gmail_msg">
 entry:<br class="gmail_msg">
         %tmp = call i64 @f8( )          ; <i64> [#uses=0]<br class="gmail_msg">
         ret void<br class="gmail_msg">
+; CHECK-LABEL: f7:<br class="gmail_msg">
+; CHECK: bl<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
 declare i64 @f8()<br class="gmail_msg">
@@ -52,8 +92,56 @@ entry:<br class="gmail_msg">
         %tmp = sub i64 %a, %b           ; <i64> [#uses=1]<br class="gmail_msg">
         ret i64 %tmp<br class="gmail_msg">
 ; CHECK-LABEL: f9:<br class="gmail_msg">
-; CHECK: sbc<br class="gmail_msg">
-; CHECK-NOT: sbc<br class="gmail_msg">
+; CHECK: subs r0, r0, r2<br class="gmail_msg">
+; CHECK: sbcs r1, r3<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+define i64 @f9a(i64 %x, i64 %y) { ; ADDC with small negative imm => SUBS imm<br class="gmail_msg">
+entry:<br class="gmail_msg">
+        %tmp1 = sub i64 %y, 10<br class="gmail_msg">
+        ret i64 %tmp1<br class="gmail_msg">
+; CHECK-LABEL: f9a:<br class="gmail_msg">
+; CHECK: movs r0, #0<br class="gmail_msg">
+; CHECK: subs r2, #10<br class="gmail_msg">
+; CHECK: sbcs r3, r0<br class="gmail_msg">
+; CHECK: movs r0, r2<br class="gmail_msg">
+; CHECK: movs r1, r3<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+define i64 @f9b(i64 %x, i64 %y) { ; ADDC with big negative imm => SUBS reg<br class="gmail_msg">
+entry:<br class="gmail_msg">
+        %tmp1 = sub i64 1000, %y<br class="gmail_msg">
+        ret i64 %tmp1<br class="gmail_msg">
+; CHECK-LABEL: f9b:<br class="gmail_msg">
+; CHECK: movs r0, #125<br class="gmail_msg">
+; CHECK: lsls r0, r0, #3<br class="gmail_msg">
+; CHECK: movs r1, #0<br class="gmail_msg">
+; CHECK: subs r0, r0, r2<br class="gmail_msg">
+; CHECK: sbcs r1, r3<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+define i64 @f9c(i64 %x, i32 %y) { ; SUBS with small positive imm => SUBS imm<br class="gmail_msg">
+entry:<br class="gmail_msg">
+        %conv = sext i32 %y to i64<br class="gmail_msg">
+        %shl = shl i64 %conv, 32<br class="gmail_msg">
+        %or = or i64 %shl, 1<br class="gmail_msg">
+        %sub = sub nsw i64 %x, %or<br class="gmail_msg">
+        ret i64 %sub<br class="gmail_msg">
+; CHECK-LABEL: f9c:<br class="gmail_msg">
+; CHECK: subs r0, r0, #1<br class="gmail_msg">
+; CHECK: sbcs r1, r2<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+define i64 @f9d(i64 %x, i32 %y) { ; SUBS with small negative imm => ADDS imm<br class="gmail_msg">
+entry:<br class="gmail_msg">
+        %conv = sext i32 %y to i64<br class="gmail_msg">
+        %shl = shl i64 %conv, 32<br class="gmail_msg">
+        %or = or i64 %shl, 4294967295<br class="gmail_msg">
+        %sub = sub nsw i64 %x, %or<br class="gmail_msg">
+        ret i64 %sub<br class="gmail_msg">
+; CHECK-LABEL: f9d:<br class="gmail_msg">
+; CHECK: adds r0, r0, #1<br class="gmail_msg">
+; CHECK: sbcs r1, r2<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
 define i64 @f(i32 %a, i32 %b) {<br class="gmail_msg">
@@ -63,6 +151,7 @@ entry:<br class="gmail_msg">
         %tmp2 = mul i64 %tmp1, %tmp             ; <i64> [#uses=1]<br class="gmail_msg">
         ret i64 %tmp2<br class="gmail_msg">
 ; CHECK-LABEL: f:<br class="gmail_msg">
+; CHECK-V6: bl __aeabi_lmul<br class="gmail_msg">
 ; CHECK-DARWIN: __muldi3<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
@@ -73,6 +162,7 @@ entry:<br class="gmail_msg">
         %tmp2 = mul i64 %tmp1, %tmp             ; <i64> [#uses=1]<br class="gmail_msg">
         ret i64 %tmp2<br class="gmail_msg">
 ; CHECK-LABEL: g:<br class="gmail_msg">
+; CHECK-V6: bl __aeabi_lmul<br class="gmail_msg">
 ; CHECK-DARWIN: __muldi3<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
@@ -81,4 +171,38 @@ entry:<br class="gmail_msg">
         %a = alloca i64, align 8                ; <i64*> [#uses=1]<br class="gmail_msg">
         %retval = load i64, i64* %a          ; <i64> [#uses=1]<br class="gmail_msg">
         ret i64 %retval<br class="gmail_msg">
+; CHECK-LABEL: f10:<br class="gmail_msg">
+; CHECK: sub sp, #8<br class="gmail_msg">
+; CHECK: ldr r0, [sp]<br class="gmail_msg">
+; CHECK: ldr r1, [sp, #4]<br class="gmail_msg">
+; CHECK: add sp, #8<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+define i64 @f11(i64 %x, i64 %y) {<br class="gmail_msg">
+entry:<br class="gmail_msg">
+        %tmp1 = add i64 -1000, %y<br class="gmail_msg">
+        %tmp2 = add i64 %tmp1, -1000<br class="gmail_msg">
+        ret i64 %tmp2<br class="gmail_msg">
+; CHECK-LABEL: f11:<br class="gmail_msg">
+; CHECK: movs r0, #125<br class="gmail_msg">
+; CHECK: lsls r0, r0, #3<br class="gmail_msg">
+; CHECK: movs r1, #0<br class="gmail_msg">
+; CHECK: subs r2, r2, r0<br class="gmail_msg">
+; CHECK: sbcs r3, r1<br class="gmail_msg">
+; CHECK: subs r0, r2, r0<br class="gmail_msg">
+; CHECK: sbcs r3, r1<br class="gmail_msg">
+; CHECK: movs r1, r3<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+; "sub <a href="tel:(214)%20748-3648" value="+12147483648" class="gmail_msg" target="_blank">2147483648</a>" has to be lowered into "add -<a href="tel:(214)%20748-3648" value="+12147483648" class="gmail_msg" target="_blank">2147483648</a>"<br class="gmail_msg">
+define i64 @f12(i64 %x, i64 %y) {<br class="gmail_msg">
+entry:<br class="gmail_msg">
+        %tmp1 = sub i64 %x, <a href="tel:(214)%20748-3648" value="+12147483648" class="gmail_msg" target="_blank">2147483648</a><br class="gmail_msg">
+        ret i64 %tmp1<br class="gmail_msg">
+; CHECK-LABEL: f12:<br class="gmail_msg">
+; CHECK: movs r2, #1<br class="gmail_msg">
+; CHECK: lsls r2, r2, #31<br class="gmail_msg">
+; CHECK: movs r3, #0<br class="gmail_msg">
+; CHECK: adds r0, r0, r2<br class="gmail_msg">
+; CHECK: sbcs r1, r3<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
llvm-commits mailing list<br class="gmail_msg">
<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="gmail_msg">
</blockquote></div>