<div dir="ltr">Hello Aditya,<br><br>One of tests is failing on<br><a href="http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win">http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win</a><br><br>...<br>Failing Tests<br> LLVM :: CodeGen/AArch64/GlobalISel/legalize-simple.mir<br><br>Please have a look?<br><br>Thanks<br><br>Galina<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Nov 14, 2017 at 2:42 PM, Aditya Nandakumar via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: aditya_nandakumar<br>
Date: Tue Nov 14 14:42:19 2017<br>
New Revision: 318210<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=318210&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=318210&view=rev</a><br>
Log:<br>
[GISel]: Rework legalization algorithm for better elimination of<br>
artifacts along with DCE<br>
<br>
Legalization Artifacts are all those insts that are there to make the<br>
type system happy. Currently, the target needs to say all combinations<br>
of extends and truncs are legal and there's no way of verifying that<br>
post legalization, we only have *truly* legal instructions. This patch<br>
changes roughly the legalization algorithm to process all illegal insts<br>
at one go, and then process all truncs/extends that were added to<br>
satisfy the type constraints separately trying to combine trivial cases<br>
until they converge. This has the added benefit that, the target<br>
legalizerinfo can only say which truncs and extends are okay and the<br>
artifact combiner would combine away other exts and truncs.<br>
<br>
Updated legalization algorithm to roughly the following pseudo code.<br>
<br>
WorkList Insts, Artifacts;<br>
collect_all_insts_and_<wbr>artifacts(Insts, Artifacts);<br>
<br>
do {<br>
  for (Inst in Insts)<br>
         legalizeInstrStep(Inst, Insts, Artifacts);<br>
  for (Artifact in Artifacts)<br>
         tryCombineArtifact(Artifact, Insts, Artifacts);<br>
} while(!Insts.empty());<br>
<br>
Also, wrote a simple wrapper equivalent to SetVector, except for<br>
erasing, it avoids moving all elements over by one and instead just<br>
nulls them out.<br>
<br>
Added:<br>
    llvm/trunk/include/llvm/<wbr>CodeGen/GlobalISel/<wbr>GISelWorkList.h<br>
    llvm/trunk/include/llvm/<wbr>CodeGen/GlobalISel/<wbr>LegalizationArtifactCombiner.h<br>
      - copied, changed from r318070, llvm/trunk/include/llvm/<wbr>CodeGen/GlobalISel/<wbr>LegalizerCombiner.h<br>
Removed:<br>
    llvm/trunk/include/llvm/<wbr>CodeGen/GlobalISel/<wbr>LegalizerCombiner.h<br>
Modified:<br>
    llvm/trunk/lib/CodeGen/<wbr>GlobalISel/Legalizer.cpp<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/arm64-<wbr>fallback.ll<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>add.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>and.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>cmp.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>combines.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>constant.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>div.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>ext.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>extracts.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>fcmp.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>fptoi.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>inserts.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>itofp.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>load-store.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>mul.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>nonpowerof2eltsvec.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>or.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>phi.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>pow.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>rem.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>shift.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>simple.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>sub.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>undef.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>vaarg.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>xor.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>add.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>and.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>bitcast.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>constant.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>fadd.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>fmul.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>icmp.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-or.<wbr>mir<br>
    llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>select.mir<br>
    llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>shl.mir<br>
    llvm/trunk/test/CodeGen/ARM/<wbr>GlobalISel/arm-isel.ll<br>
    llvm/trunk/test/CodeGen/ARM/<wbr>GlobalISel/arm-legalize-<wbr>divmod.mir<br>
    llvm/trunk/test/CodeGen/ARM/<wbr>GlobalISel/arm-legalize-fp.mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/add-scalar.ll<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/and-scalar.ll<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/ext.ll<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-add-v128.<wbr>mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-add-v256.<wbr>mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-add-v512.<wbr>mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-add.mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-and-<wbr>scalar.mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-constant.<wbr>mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-ext-x86-<wbr>64.mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-ext.mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-gep.mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-memop-<wbr>scalar.mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-mul-<wbr>scalar.mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-or-scalar.<wbr>mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-phi.mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-sub-v128.<wbr>mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-sub-v256.<wbr>mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-sub-v512.<wbr>mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-sub.mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-trunc.mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-undef.mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-xor-<wbr>scalar.mir<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/or-scalar.ll<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/sub-scalar.ll<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/x86_64-fallback.ll<br>
    llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/xor-scalar.ll<br>
<br>
Added: llvm/trunk/include/llvm/<wbr>CodeGen/GlobalISel/<wbr>GISelWorkList.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/GlobalISel/GISelWorkList.h?rev=318210&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/CodeGen/GlobalISel/<wbr>GISelWorkList.h?rev=318210&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/<wbr>CodeGen/GlobalISel/<wbr>GISelWorkList.h (added)<br>
+++ llvm/trunk/include/llvm/<wbr>CodeGen/GlobalISel/<wbr>GISelWorkList.h Tue Nov 14 14:42:19 2017<br>
@@ -0,0 +1,67 @@<br>
+//===- GISelWorkList.h - Worklist for GISel passes ----*- C++ -*-===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+#ifndef LLVM_GISEL_WORKLIST_H<br>
+#define LLVM_GISEL_WORKLIST_H<br>
+<br>
+#include "llvm/ADT/DenseMap.h"<br>
+#include "llvm/ADT/SmallVector.h"<br>
+#include "llvm/Support/Debug.h"<br>
+<br>
+namespace llvm {<br>
+<br>
+// Worklist which mostly works similar to InstCombineWorkList, but on MachineInstrs.<br>
+// The main difference with something like a SetVector is that erasing an element doesn't<br>
+// move all elements over one place - instead just nulls out the element of the vector.<br>
+// FIXME: Does it make sense to factor out common code with the instcombinerWorkList?<br>
+template<unsigned N><br>
+class GISelWorkList {<br>
+  SmallVector<MachineInstr*, N> Worklist;<br>
+  DenseMap<MachineInstr*, unsigned> WorklistMap;<br>
+<br>
+public:<br>
+  GISelWorkList() = default;<br>
+<br>
+  bool empty() const { return WorklistMap.empty(); }<br>
+<br>
+  unsigned size() const { return WorklistMap.size(); }<br>
+<br>
+  /// Add - Add the specified instruction to the worklist if it isn't already<br>
+  /// in it.<br>
+  void insert(MachineInstr *I) {<br>
+    if (WorklistMap.try_emplace(I, Worklist.size()).second) {<br>
+      Worklist.push_back(I);<br>
+    }<br>
+  }<br>
+<br>
+  /// Remove - remove I from the worklist if it exists.<br>
+  void remove(MachineInstr *I) {<br>
+    auto It = WorklistMap.find(I);<br>
+    if (It == WorklistMap.end()) return; // Not in worklist.<br>
+<br>
+    // Don't bother moving everything down, just null out the slot.<br>
+    Worklist[It->second] = nullptr;<br>
+<br>
+    WorklistMap.erase(It);<br>
+  }<br>
+<br>
+  MachineInstr *pop_back_val() {<br>
+    MachineInstr *I;<br>
+    do {<br>
+      I = Worklist.pop_back_val();<br>
+    } while(!I);<br>
+    assert(I && "Pop back on empty worklist");<br>
+    WorklistMap.erase(I);<br>
+    return I;<br>
+  }<br>
+};<br>
+<br>
+} // end namespace llvm.<br>
+<br>
+#endif<br>
<br>
Copied: llvm/trunk/include/llvm/<wbr>CodeGen/GlobalISel/<wbr>LegalizationArtifactCombiner.h (from r318070, llvm/trunk/include/llvm/<wbr>CodeGen/GlobalISel/<wbr>LegalizerCombiner.h)<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h?p2=llvm/trunk/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h&p1=llvm/trunk/include/llvm/CodeGen/GlobalISel/LegalizerCombiner.h&r1=318070&r2=318210&rev=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/CodeGen/GlobalISel/<wbr>LegalizationArtifactCombiner.<wbr>h?p2=llvm/trunk/include/llvm/<wbr>CodeGen/GlobalISel/<wbr>LegalizationArtifactCombiner.<wbr>h&p1=llvm/trunk/include/llvm/<wbr>CodeGen/GlobalISel/<wbr>LegalizerCombiner.h&r1=318070&<wbr>r2=318210&rev=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/<wbr>CodeGen/GlobalISel/<wbr>LegalizerCombiner.h (original)<br>
+++ llvm/trunk/include/llvm/<wbr>CodeGen/GlobalISel/<wbr>LegalizationArtifactCombiner.h Tue Nov 14 14:42:19 2017<br>
@@ -1,4 +1,4 @@<br>
-//===-- llvm/CodeGen/GlobalISel/<wbr>LegalizerCombiner.h --===========//<br>
+//===-- llvm/CodeGen/GlobalISel/<wbr>LegalizationArtifactCombiner.h --===========//<br>
 //<br>
 //                     The LLVM Compiler Infrastructure<br>
 //<br>
@@ -22,13 +22,13 @@<br>
 #define DEBUG_TYPE "legalizer"<br>
<br>
 namespace llvm {<br>
-class LegalizerCombiner {<br>
+class LegalizationArtifactCombiner {<br>
   MachineIRBuilder &Builder;<br>
   MachineRegisterInfo &MRI;<br>
   const LegalizerInfo &LI;<br>
<br>
 public:<br>
-  LegalizerCombiner(<wbr>MachineIRBuilder &B, MachineRegisterInfo &MRI,<br>
+  LegalizationArtifactCombiner(<wbr>MachineIRBuilder &B, MachineRegisterInfo &MRI,<br>
                     const LegalizerInfo &LI)<br>
       : Builder(B), MRI(MRI), LI(LI) {}<br>
<br>
@@ -36,8 +36,8 @@ public:<br>
                         SmallVectorImpl<MachineInstr *> &DeadInsts) {<br>
     if (MI.getOpcode() != TargetOpcode::G_ANYEXT)<br>
       return false;<br>
-    MachineInstr *DefMI = MRI.getVRegDef(MI.getOperand(<wbr>1).getReg());<br>
-    if (DefMI->getOpcode() == TargetOpcode::G_TRUNC) {<br>
+    if (MachineInstr *DefMI =<br>
+            getOpcodeDef(TargetOpcode::G_<wbr>TRUNC, MI.getOperand(1).getReg())) {<br>
       DEBUG(dbgs() << ".. Combine MI: " << MI;);<br>
       unsigned DstReg = MI.getOperand(0).getReg();<br>
       unsigned SrcReg = DefMI->getOperand(1).getReg();<br>
@@ -47,7 +47,7 @@ public:<br>
       markInstAndDefDead(MI, *DefMI, DeadInsts);<br>
       return true;<br>
     }<br>
-    return false;<br>
+    return tryFoldImplicitDef(MI, DeadInsts);<br>
   }<br>
<br>
   bool tryCombineZExt(MachineInstr &MI,<br>
@@ -55,8 +55,8 @@ public:<br>
<br>
     if (MI.getOpcode() != TargetOpcode::G_ZEXT)<br>
       return false;<br>
-    MachineInstr *DefMI = MRI.getVRegDef(MI.getOperand(<wbr>1).getReg());<br>
-    if (DefMI->getOpcode() == TargetOpcode::G_TRUNC) {<br>
+    if (MachineInstr *DefMI =<br>
+            getOpcodeDef(TargetOpcode::G_<wbr>TRUNC, MI.getOperand(1).getReg())) {<br>
       unsigned DstReg = MI.getOperand(0).getReg();<br>
       LLT DstTy = MRI.getType(DstReg);<br>
       if (isInstUnsupported(<wbr>TargetOpcode::G_AND, DstTy) ||<br>
@@ -75,7 +75,7 @@ public:<br>
       markInstAndDefDead(MI, *DefMI, DeadInsts);<br>
       return true;<br>
     }<br>
-    return false;<br>
+    return tryFoldImplicitDef(MI, DeadInsts);<br>
   }<br>
<br>
   bool tryCombineSExt(MachineInstr &MI,<br>
@@ -83,8 +83,8 @@ public:<br>
<br>
     if (MI.getOpcode() != TargetOpcode::G_SEXT)<br>
       return false;<br>
-    MachineInstr *DefMI = MRI.getVRegDef(MI.getOperand(<wbr>1).getReg());<br>
-    if (DefMI->getOpcode() == TargetOpcode::G_TRUNC) {<br>
+    if (MachineInstr *DefMI =<br>
+            getOpcodeDef(TargetOpcode::G_<wbr>TRUNC, MI.getOperand(1).getReg())) {<br>
       unsigned DstReg = MI.getOperand(0).getReg();<br>
       LLT DstTy = MRI.getType(DstReg);<br>
       if (isInstUnsupported(<wbr>TargetOpcode::G_SHL, DstTy) ||<br>
@@ -106,6 +106,29 @@ public:<br>
       markInstAndDefDead(MI, *DefMI, DeadInsts);<br>
       return true;<br>
     }<br>
+    return tryFoldImplicitDef(MI, DeadInsts);<br>
+  }<br>
+<br>
+  /// Try to fold sb = EXTEND (G_IMPLICIT_DEF sa) -> sb = G_IMPLICIT_DEF<br>
+  bool tryFoldImplicitDef(<wbr>MachineInstr &MI,<br>
+                          SmallVectorImpl<MachineInstr *> &DeadInsts) {<br>
+    unsigned Opcode = MI.getOpcode();<br>
+    if (Opcode != TargetOpcode::G_ANYEXT && Opcode != TargetOpcode::G_ZEXT &&<br>
+        Opcode != TargetOpcode::G_SEXT)<br>
+      return false;<br>
+<br>
+    if (MachineInstr *DefMI = getOpcodeDef(TargetOpcode::G_<wbr>IMPLICIT_DEF,<br>
+                                           MI.getOperand(1).getReg())) {<br>
+      unsigned DstReg = MI.getOperand(0).getReg();<br>
+      LLT DstTy = MRI.getType(DstReg);<br>
+      if (isInstUnsupported(<wbr>TargetOpcode::G_IMPLICIT_DEF, DstTy))<br>
+        return false;<br>
+      DEBUG(dbgs() << ".. Combine EXT(IMPLICIT_DEF) " << MI;);<br>
+      Builder.setInstr(MI);<br>
+      Builder.buildInstr(<wbr>TargetOpcode::G_IMPLICIT_DEF, DstReg);<br>
+      markInstAndDefDead(MI, *DefMI, DeadInsts);<br>
+      return true;<br>
+    }<br>
     return false;<br>
   }<br>
<br>
@@ -200,6 +223,12 @@ public:<br>
       return tryCombineSExt(MI, DeadInsts);<br>
     case TargetOpcode::G_UNMERGE_<wbr>VALUES:<br>
       return tryCombineMerges(MI, DeadInsts);<br>
+    case TargetOpcode::G_TRUNC: {<br>
+      bool Changed = false;<br>
+      for (auto &Use : MRI.use_instructions(MI.<wbr>getOperand(0).getReg()))<br>
+        Changed |= tryCombineInstruction(Use, DeadInsts);<br>
+      return Changed;<br>
+    }<br>
     }<br>
   }<br>
<br>
@@ -219,6 +248,23 @@ private:<br>
     return Action.first == LegalizerInfo::LegalizeAction:<wbr>:Unsupported ||<br>
            Action.first == LegalizerInfo::LegalizeAction:<wbr>:NotFound;<br>
   }<br>
+  /// See if Reg is defined by an single def instruction that is<br>
+  /// Opcode. Also try to do trivial folding if it's a COPY with<br>
+  /// same types. Returns null otherwise.<br>
+  MachineInstr *getOpcodeDef(unsigned Opcode, unsigned Reg) {<br>
+    auto *DefMI = MRI.getVRegDef(Reg);<br>
+    auto DstTy = MRI.getType(DefMI->getOperand(<wbr>0).getReg());<br>
+    if (!DstTy.isValid())<br>
+      return nullptr;<br>
+    while (DefMI->getOpcode() == TargetOpcode::COPY) {<br>
+      unsigned SrcReg = DefMI->getOperand(1).getReg();<br>
+      auto SrcTy = MRI.getType(SrcReg);<br>
+      if (!SrcTy.isValid() || SrcTy != DstTy)<br>
+        break;<br>
+      DefMI = MRI.getVRegDef(SrcReg);<br>
+    }<br>
+    return DefMI->getOpcode() == Opcode ? DefMI : nullptr;<br>
+  }<br>
 };<br>
<br>
 } // namespace llvm<br>
<br>
Removed: llvm/trunk/include/llvm/<wbr>CodeGen/GlobalISel/<wbr>LegalizerCombiner.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/GlobalISel/LegalizerCombiner.h?rev=318209&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/CodeGen/GlobalISel/<wbr>LegalizerCombiner.h?rev=<wbr>318209&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/<wbr>CodeGen/GlobalISel/<wbr>LegalizerCombiner.h (original)<br>
+++ llvm/trunk/include/llvm/<wbr>CodeGen/GlobalISel/<wbr>LegalizerCombiner.h (removed)<br>
@@ -1,224 +0,0 @@<br>
-//===-- llvm/CodeGen/GlobalISel/<wbr>LegalizerCombiner.h --===========//<br>
-//<br>
-//                     The LLVM Compiler Infrastructure<br>
-//<br>
-// This file is distributed under the University of Illinois Open Source<br>
-// License. See LICENSE.TXT for details.<br>
-//<br>
-//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
-// This file contains some helper functions which try to cleanup artifacts<br>
-// such as G_TRUNCs/G_[ZSA]EXTENDS that were created during legalization to make<br>
-// the types match. This file also contains some combines of merges that happens<br>
-// at the end of the legalization.<br>
-//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
-<br>
-#include "llvm/CodeGen/GlobalISel/<wbr>Legalizer.h"<br>
-#include "llvm/CodeGen/GlobalISel/<wbr>LegalizerInfo.h"<br>
-#include "llvm/CodeGen/GlobalISel/<wbr>MachineIRBuilder.h"<br>
-#include "llvm/CodeGen/GlobalISel/<wbr>Utils.h"<br>
-#include "llvm/CodeGen/<wbr>MachineRegisterInfo.h"<br>
-#include "llvm/Support/Debug.h"<br>
-<br>
-#define DEBUG_TYPE "legalizer"<br>
-<br>
-namespace llvm {<br>
-class LegalizerCombiner {<br>
-  MachineIRBuilder &Builder;<br>
-  MachineRegisterInfo &MRI;<br>
-  const LegalizerInfo &LI;<br>
-<br>
-public:<br>
-  LegalizerCombiner(<wbr>MachineIRBuilder &B, MachineRegisterInfo &MRI,<br>
-                    const LegalizerInfo &LI)<br>
-      : Builder(B), MRI(MRI), LI(LI) {}<br>
-<br>
-  bool tryCombineAnyExt(MachineInstr &MI,<br>
-                        SmallVectorImpl<MachineInstr *> &DeadInsts) {<br>
-    if (MI.getOpcode() != TargetOpcode::G_ANYEXT)<br>
-      return false;<br>
-    MachineInstr *DefMI = MRI.getVRegDef(MI.getOperand(<wbr>1).getReg());<br>
-    if (DefMI->getOpcode() == TargetOpcode::G_TRUNC) {<br>
-      DEBUG(dbgs() << ".. Combine MI: " << MI;);<br>
-      unsigned DstReg = MI.getOperand(0).getReg();<br>
-      unsigned SrcReg = DefMI->getOperand(1).getReg();<br>
-      Builder.setInstr(MI);<br>
-      // We get a copy/trunc/extend depending on the sizes<br>
-      Builder.buildAnyExtOrTrunc(<wbr>DstReg, SrcReg);<br>
-      markInstAndDefDead(MI, *DefMI, DeadInsts);<br>
-      return true;<br>
-    }<br>
-    return false;<br>
-  }<br>
-<br>
-  bool tryCombineZExt(MachineInstr &MI,<br>
-                      SmallVectorImpl<MachineInstr *> &DeadInsts) {<br>
-<br>
-    if (MI.getOpcode() != TargetOpcode::G_ZEXT)<br>
-      return false;<br>
-    MachineInstr *DefMI = MRI.getVRegDef(MI.getOperand(<wbr>1).getReg());<br>
-    if (DefMI->getOpcode() == TargetOpcode::G_TRUNC) {<br>
-      unsigned DstReg = MI.getOperand(0).getReg();<br>
-      LLT DstTy = MRI.getType(DstReg);<br>
-      if (isInstUnsupported(<wbr>TargetOpcode::G_AND, DstTy) ||<br>
-          isInstUnsupported(<wbr>TargetOpcode::G_CONSTANT, DstTy))<br>
-        return false;<br>
-      DEBUG(dbgs() << ".. Combine MI: " << MI;);<br>
-      Builder.setInstr(MI);<br>
-      unsigned ZExtSrc = MI.getOperand(1).getReg();<br>
-      LLT ZExtSrcTy = MRI.getType(ZExtSrc);<br>
-      APInt Mask = APInt::getAllOnesValue(<wbr>ZExtSrcTy.getSizeInBits());<br>
-      auto MaskCstMIB = Builder.buildConstant(DstTy, Mask.getZExtValue());<br>
-      unsigned TruncSrc = DefMI->getOperand(1).getReg();<br>
-      // We get a copy/trunc/extend depending on the sizes<br>
-      auto SrcCopyOrTrunc = Builder.buildAnyExtOrTrunc(<wbr>DstTy, TruncSrc);<br>
-      Builder.buildAnd(DstReg, SrcCopyOrTrunc, MaskCstMIB);<br>
-      markInstAndDefDead(MI, *DefMI, DeadInsts);<br>
-      return true;<br>
-    }<br>
-    return false;<br>
-  }<br>
-<br>
-  bool tryCombineSExt(MachineInstr &MI,<br>
-                      SmallVectorImpl<MachineInstr *> &DeadInsts) {<br>
-<br>
-    if (MI.getOpcode() != TargetOpcode::G_SEXT)<br>
-      return false;<br>
-    MachineInstr *DefMI = MRI.getVRegDef(MI.getOperand(<wbr>1).getReg());<br>
-    if (DefMI->getOpcode() == TargetOpcode::G_TRUNC) {<br>
-      unsigned DstReg = MI.getOperand(0).getReg();<br>
-      LLT DstTy = MRI.getType(DstReg);<br>
-      if (isInstUnsupported(<wbr>TargetOpcode::G_SHL, DstTy) ||<br>
-          isInstUnsupported(<wbr>TargetOpcode::G_ASHR, DstTy) ||<br>
-          isInstUnsupported(<wbr>TargetOpcode::G_CONSTANT, DstTy))<br>
-        return false;<br>
-      DEBUG(dbgs() << ".. Combine MI: " << MI;);<br>
-      Builder.setInstr(MI);<br>
-      unsigned SExtSrc = MI.getOperand(1).getReg();<br>
-      LLT SExtSrcTy = MRI.getType(SExtSrc);<br>
-      unsigned SizeDiff = DstTy.getSizeInBits() - SExtSrcTy.getSizeInBits();<br>
-      auto SizeDiffMIB = Builder.buildConstant(DstTy, SizeDiff);<br>
-      unsigned TruncSrcReg = DefMI->getOperand(1).getReg();<br>
-      // We get a copy/trunc/extend depending on the sizes<br>
-      auto SrcCopyExtOrTrunc = Builder.buildAnyExtOrTrunc(<wbr>DstTy, TruncSrcReg);<br>
-      auto ShlMIB = Builder.buildInstr(<wbr>TargetOpcode::G_SHL, DstTy,<br>
-                                       SrcCopyExtOrTrunc, SizeDiffMIB);<br>
-      Builder.buildInstr(<wbr>TargetOpcode::G_ASHR, DstReg, ShlMIB, SizeDiffMIB);<br>
-      markInstAndDefDead(MI, *DefMI, DeadInsts);<br>
-      return true;<br>
-    }<br>
-    return false;<br>
-  }<br>
-<br>
-  bool tryCombineMerges(MachineInstr &MI,<br>
-                        SmallVectorImpl<MachineInstr *> &DeadInsts) {<br>
-<br>
-    if (MI.getOpcode() != TargetOpcode::G_UNMERGE_<wbr>VALUES)<br>
-      return false;<br>
-<br>
-    unsigned NumDefs = MI.getNumOperands() - 1;<br>
-    unsigned SrcReg = MI.getOperand(NumDefs).getReg(<wbr>);<br>
-    MachineInstr *MergeI = MRI.getVRegDef(SrcReg);<br>
-    if (!MergeI || (MergeI->getOpcode() != TargetOpcode::G_MERGE_VALUES))<br>
-      return false;<br>
-<br>
-    const unsigned NumMergeRegs = MergeI->getNumOperands() - 1;<br>
-<br>
-    if (NumMergeRegs < NumDefs) {<br>
-      if (NumDefs % NumMergeRegs != 0)<br>
-        return false;<br>
-<br>
-      Builder.setInstr(MI);<br>
-      // Transform to UNMERGEs, for example<br>
-      //   %1 = G_MERGE_VALUES %4, %5<br>
-      //   %9, %10, %11, %12 = G_UNMERGE_VALUES %1<br>
-      // to<br>
-      //   %9, %10 = G_UNMERGE_VALUES %4<br>
-      //   %11, %12 = G_UNMERGE_VALUES %5<br>
-<br>
-      const unsigned NewNumDefs = NumDefs / NumMergeRegs;<br>
-      for (unsigned Idx = 0; Idx < NumMergeRegs; ++Idx) {<br>
-        SmallVector<unsigned, 2> DstRegs;<br>
-        for (unsigned j = 0, DefIdx = Idx * NewNumDefs; j < NewNumDefs;<br>
-             ++j, ++DefIdx)<br>
-          DstRegs.push_back(MI.<wbr>getOperand(DefIdx).getReg());<br>
-<br>
-        Builder.buildUnmerge(DstRegs, MergeI->getOperand(Idx + 1).getReg());<br>
-      }<br>
-<br>
-    } else if (NumMergeRegs > NumDefs) {<br>
-      if (NumMergeRegs % NumDefs != 0)<br>
-        return false;<br>
-<br>
-      Builder.setInstr(MI);<br>
-      // Transform to MERGEs<br>
-      //   %6 = G_MERGE_VALUES %17, %18, %19, %20<br>
-      //   %7, %8 = G_UNMERGE_VALUES %6<br>
-      // to<br>
-      //   %7 = G_MERGE_VALUES %17, %18<br>
-      //   %8 = G_MERGE_VALUES %19, %20<br>
-<br>
-      const unsigned NumRegs = NumMergeRegs / NumDefs;<br>
-      for (unsigned DefIdx = 0; DefIdx < NumDefs; ++DefIdx) {<br>
-        SmallVector<unsigned, 2> Regs;<br>
-        for (unsigned j = 0, Idx = NumRegs * DefIdx + 1; j < NumRegs;<br>
-             ++j, ++Idx)<br>
-          Regs.push_back(MergeI-><wbr>getOperand(Idx).getReg());<br>
-<br>
-        Builder.buildMerge(MI.<wbr>getOperand(DefIdx).getReg(), Regs);<br>
-      }<br>
-<br>
-    } else {<br>
-      // FIXME: is a COPY appropriate if the types mismatch? We know both<br>
-      // registers are allocatable by now.<br>
-      if (MRI.getType(MI.getOperand(0).<wbr>getReg()) !=<br>
-          MRI.getType(MergeI-><wbr>getOperand(1).getReg()))<br>
-        return false;<br>
-<br>
-      for (unsigned Idx = 0; Idx < NumDefs; ++Idx)<br>
-        MRI.replaceRegWith(MI.<wbr>getOperand(Idx).getReg(),<br>
-                           MergeI->getOperand(Idx + 1).getReg());<br>
-    }<br>
-<br>
-    markInstAndDefDead(MI, *MergeI, DeadInsts);<br>
-    return true;<br>
-  }<br>
-<br>
-  /// Try to combine away MI.<br>
-  /// Returns true if it combined away the MI.<br>
-  /// Adds instructions that are dead as a result of the combine<br>
-  /// into DeadInsts, which can include MI.<br>
-  bool tryCombineInstruction(<wbr>MachineInstr &MI,<br>
-                             SmallVectorImpl<MachineInstr *> &DeadInsts) {<br>
-    switch (MI.getOpcode()) {<br>
-    default:<br>
-      return false;<br>
-    case TargetOpcode::G_ANYEXT:<br>
-      return tryCombineAnyExt(MI, DeadInsts);<br>
-    case TargetOpcode::G_ZEXT:<br>
-      return tryCombineZExt(MI, DeadInsts);<br>
-    case TargetOpcode::G_SEXT:<br>
-      return tryCombineSExt(MI, DeadInsts);<br>
-    case TargetOpcode::G_UNMERGE_<wbr>VALUES:<br>
-      return tryCombineMerges(MI, DeadInsts);<br>
-    }<br>
-  }<br>
-<br>
-private:<br>
-  /// Mark MI as dead. If a def of one of MI's operands, DefMI, would also be<br>
-  /// dead due to MI being killed, then mark DefMI as dead too.<br>
-  void markInstAndDefDead(<wbr>MachineInstr &MI, MachineInstr &DefMI,<br>
-                          SmallVectorImpl<MachineInstr *> &DeadInsts) {<br>
-    DeadInsts.push_back(&MI);<br>
-    if (MRI.hasOneUse(DefMI.<wbr>getOperand(0).getReg()))<br>
-      DeadInsts.push_back(&DefMI);<br>
-  }<br>
-  /// Checks if the target legalizer info has specified anything about the<br>
-  /// instruction, or if unsupported.<br>
-  bool isInstUnsupported(unsigned Opcode, const LLT &DstTy) const {<br>
-    auto Action = LI.getAction({Opcode, 0, DstTy});<br>
-    return Action.first == LegalizerInfo::LegalizeAction:<wbr>:Unsupported ||<br>
-           Action.first == LegalizerInfo::LegalizeAction:<wbr>:NotFound;<br>
-  }<br>
-};<br>
-<br>
-} // namespace llvm<br>
<br>
Modified: llvm/trunk/lib/CodeGen/<wbr>GlobalISel/Legalizer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/GlobalISel/Legalizer.cpp?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>CodeGen/GlobalISel/Legalizer.<wbr>cpp?rev=318210&r1=318209&r2=<wbr>318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/CodeGen/<wbr>GlobalISel/Legalizer.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/<wbr>GlobalISel/Legalizer.cpp Tue Nov 14 14:42:19 2017<br>
@@ -14,10 +14,12 @@<br>
 //===-------------------------<wbr>------------------------------<wbr>---------------===//<br>
<br>
 #include "llvm/CodeGen/GlobalISel/<wbr>Legalizer.h"<br>
+#include "llvm/ADT/PostOrderIterator.h"<br>
 #include "llvm/ADT/SetVector.h"<br>
-#include "llvm/CodeGen/GlobalISel/<wbr>LegalizerCombiner.h"<br>
+#include "llvm/CodeGen/GlobalISel/<wbr>LegalizationArtifactCombiner.<wbr>h"<br>
 #include "llvm/CodeGen/GlobalISel/<wbr>LegalizerHelper.h"<br>
 #include "llvm/CodeGen/GlobalISel/<wbr>Utils.h"<br>
+#include "llvm/CodeGen/GlobalISel/<wbr>GISelWorkList.h"<br>
 #include "llvm/CodeGen/<wbr>MachineOptimizationRemarkEmitt<wbr>er.h"<br>
 #include "llvm/CodeGen/<wbr>MachineRegisterInfo.h"<br>
 #include "llvm/CodeGen/TargetInstrInfo.<wbr>h"<br>
@@ -52,6 +54,20 @@ void Legalizer::getAnalysisUsage(<wbr>Analysi<br>
 void Legalizer::init(<wbr>MachineFunction &MF) {<br>
 }<br>
<br>
+static bool isArtifact(const MachineInstr &MI) {<br>
+  switch (MI.getOpcode()) {<br>
+  default:<br>
+    return false;<br>
+  case TargetOpcode::G_TRUNC:<br>
+  case TargetOpcode::G_ZEXT:<br>
+  case TargetOpcode::G_ANYEXT:<br>
+  case TargetOpcode::G_SEXT:<br>
+  case TargetOpcode::G_MERGE_VALUES:<br>
+  case TargetOpcode::G_UNMERGE_<wbr>VALUES:<br>
+    return true;<br>
+  }<br>
+}<br>
+<br>
 bool Legalizer::<wbr>runOnMachineFunction(<wbr>MachineFunction &MF) {<br>
   // If the ISel pipeline failed, do not bother running that pass.<br>
   if (MF.getProperties().<wbr>hasProperty(<br>
@@ -63,114 +79,108 @@ bool Legalizer::<wbr>runOnMachineFunction(Mac<br>
   MachineOptimizationRemarkEmitt<wbr>er MORE(MF, /*MBFI=*/nullptr);<br>
   LegalizerHelper Helper(MF);<br>
<br>
-  // FIXME: an instruction may need more than one pass before it is legal. For<br>
-  // example on most architectures <3 x i3> is doubly-illegal. It would<br>
-  // typically proceed along a path like: <3 x i3> -> <3 x i8> -> <8 x i8>. We<br>
-  // probably want a worklist of instructions rather than naive iterate until<br>
-  // convergence for performance reasons.<br>
-  bool Changed = false;<br>
-  MachineBasicBlock::iterator NextMI;<br>
-  using VecType = SmallSetVector<MachineInstr *, 8>;<br>
-  VecType WorkList;<br>
-  VecType CombineList;<br>
-  for (auto &MBB : MF) {<br>
-    for (auto MI = MBB.begin(); MI != MBB.end(); MI = NextMI) {<br>
-      // Get the next Instruction before we try to legalize, because there's a<br>
-      // good chance MI will be deleted.<br>
-      NextMI = std::next(MI);<br>
+  const size_t NumBlocks = MF.size();<br>
+  MachineRegisterInfo &MRI = MF.getRegInfo();<br>
<br>
+  // Populate Insts<br>
+  GISelWorkList<256> InstList;<br>
+  GISelWorkList<128> ArtifactList;<br>
+  ReversePostOrderTraversal<<wbr>MachineFunction *> RPOT(&MF);<br>
+  // Perform legalization bottom up so we can DCE as we legalize.<br>
+  // Traverse BB in RPOT and within each basic block, add insts top down,<br>
+  // so when we pop_back_val in the legalization process, we traverse bottom-up.<br>
+  for (auto *MBB : RPOT) {<br>
+    if (MBB->empty())<br>
+      continue;<br>
+    for (MachineInstr &MI : *MBB) {<br>
       // Only legalize pre-isel generic instructions: others don't have types<br>
       // and are assumed to be legal.<br>
-      if (!isPreISelGenericOpcode(MI-><wbr>getOpcode()))<br>
+      if (!isPreISelGenericOpcode(MI.<wbr>getOpcode()))<br>
         continue;<br>
-      unsigned NumNewInsns = 0;<br>
-      WorkList.clear();<br>
-      CombineList.clear();<br>
-      Helper.MIRBuilder.<wbr>recordInsertions([&](<wbr>MachineInstr *MI) {<br>
-        // Only legalize pre-isel generic instructions.<br>
-        // Legalization process could generate Target specific pseudo<br>
-        // instructions with generic types. Don't record them<br>
-        if (isPreISelGenericOpcode(MI-><wbr>getOpcode())) {<br>
-          ++NumNewInsns;<br>
-          WorkList.insert(MI);<br>
-          CombineList.insert(MI);<br>
-        }<br>
-      });<br>
-      WorkList.insert(&*MI);<br>
-      LegalizerCombiner C(Helper.MIRBuilder, MF.getRegInfo(),<br>
-                          Helper.getLegalizerInfo());<br>
-      bool Changed = false;<br>
-      LegalizerHelper::<wbr>LegalizeResult Res;<br>
-      do {<br>
-        assert(!WorkList.empty() && "Expecting illegal ops");<br>
-        while (!WorkList.empty()) {<br>
-          NumNewInsns = 0;<br>
-          MachineInstr *CurrInst = WorkList.pop_back_val();<br>
-          Res = Helper.legalizeInstrStep(*<wbr>CurrInst);<br>
-          // Error out if we couldn't legalize this instruction. We may want to<br>
-          // fall back to DAG ISel instead in the future.<br>
-          if (Res == LegalizerHelper::<wbr>UnableToLegalize) {<br>
-            Helper.MIRBuilder.<wbr>stopRecordingInsertions();<br>
-            if (Res == LegalizerHelper::<wbr>UnableToLegalize) {<br>
-              reportGISelFailure(MF, TPC, MORE, "gisel-legalize",<br>
-                                 "unable to legalize instruction", *CurrInst);<br>
-              return false;<br>
-            }<br>
-          }<br>
-          Changed |= Res == LegalizerHelper::Legalized;<br>
-          // If CurrInst was legalized, there's a good chance that it might have<br>
-          // been erased. So remove it from the Combine List.<br>
-          if (Res == LegalizerHelper::Legalized)<br>
-            CombineList.remove(CurrInst);<br>
-<br>
-#ifndef NDEBUG<br>
-          if (NumNewInsns)<br>
-            for (unsigned I = WorkList.size() - NumNewInsns,<br>
-                          E = WorkList.size();<br>
-                 I != E; ++I)<br>
-              DEBUG(dbgs() << ".. .. New MI: " << *WorkList[I];);<br>
-#endif<br>
-        }<br>
-        // Do the combines.<br>
-        while (!CombineList.empty()) {<br>
-          NumNewInsns = 0;<br>
-          MachineInstr *CurrInst = CombineList.pop_back_val();<br>
-          SmallVector<MachineInstr *, 4> DeadInstructions;<br>
-          Changed |= C.tryCombineInstruction(*<wbr>CurrInst, DeadInstructions);<br>
-          for (auto *DeadMI : DeadInstructions) {<br>
-            DEBUG(dbgs() << ".. Erasing Dead Instruction " << *DeadMI);<br>
-            CombineList.remove(DeadMI);<br>
-            WorkList.remove(DeadMI);<br>
-            DeadMI->eraseFromParent();<br>
-          }<br>
-#ifndef NDEBUG<br>
-          if (NumNewInsns)<br>
-            for (unsigned I = CombineList.size() - NumNewInsns,<br>
-                          E = CombineList.size();<br>
-                 I != E; ++I)<br>
-              DEBUG(dbgs() << ".. .. Combine New MI: " << *CombineList[I];);<br>
-#endif<br>
-        }<br>
-      } while (!WorkList.empty());<br>
-<br>
-      Helper.MIRBuilder.<wbr>stopRecordingInsertions();<br>
+      if (isArtifact(MI))<br>
+        ArtifactList.insert(&MI);<br>
+      else<br>
+        InstList.insert(&MI);<br>
     }<br>
   }<br>
+  Helper.MIRBuilder.<wbr>recordInsertions([&](<wbr>MachineInstr *MI) {<br>
+    // Only legalize pre-isel generic instructions.<br>
+    // Legalization process could generate Target specific pseudo<br>
+    // instructions with generic types. Don't record them<br>
+    if (isPreISelGenericOpcode(MI-><wbr>getOpcode())) {<br>
+      if (isArtifact(*MI))<br>
+        ArtifactList.insert(MI);<br>
+      else<br>
+        InstList.insert(MI);<br>
+    }<br>
+    DEBUG(dbgs() << ".. .. New MI: " << *MI;);<br>
+  });<br>
+  const LegalizerInfo &LInfo(Helper.<wbr>getLegalizerInfo());<br>
+  LegalizationArtifactCombiner ArtCombiner(Helper.MIRBuilder, MF.getRegInfo(), LInfo);<br>
+  auto RemoveDeadInstFromLists = [&InstList,<br>
+                                  &ArtifactList](MachineInstr *DeadMI) {<br>
+    InstList.remove(DeadMI);<br>
+    ArtifactList.remove(DeadMI);<br>
+  };<br>
+  bool Changed = false;<br>
+  do {<br>
+    while (!InstList.empty()) {<br>
+      MachineInstr &MI = *InstList.pop_back_val();<br>
+      assert(isPreISelGenericOpcode(<wbr>MI.getOpcode()) && "Expecting generic opcode");<br>
+      if (isTriviallyDead(MI, MRI)) {<br>
+        DEBUG(dbgs() << MI << "Is dead; erasing.\n");<br>
+        MI.<wbr>eraseFromParentAndMarkDBGValue<wbr>sForRemoval();<br>
+        continue;<br>
+      }<br>
<br>
-  MachineRegisterInfo &MRI = MF.getRegInfo();<br>
-  MachineIRBuilder MIRBuilder(MF);<br>
-  LegalizerCombiner C(MIRBuilder, MRI, Helper.getLegalizerInfo());<br>
-  for (auto &MBB : MF) {<br>
-    for (auto MI = MBB.begin(); MI != MBB.end(); MI = NextMI) {<br>
-      // Get the next Instruction before we try to legalize, because there's a<br>
-      // good chance MI will be deleted.<br>
-      // TOOD: Perhaps move this to a combiner pass later?.<br>
-      NextMI = std::next(MI);<br>
-      SmallVector<MachineInstr *, 4> DeadInsts;<br>
-      Changed |= C.tryCombineMerges(*MI, DeadInsts);<br>
-      for (auto *DeadMI : DeadInsts)<br>
-        DeadMI->eraseFromParent();<br>
+      // Do the legalization for this instruction.<br>
+      auto Res = Helper.legalizeInstrStep(MI);<br>
+      // Error out if we couldn't legalize this instruction. We may want to<br>
+      // fall back to DAG ISel instead in the future.<br>
+      if (Res == LegalizerHelper::<wbr>UnableToLegalize) {<br>
+        Helper.MIRBuilder.<wbr>stopRecordingInsertions();<br>
+        reportGISelFailure(MF, TPC, MORE, "gisel-legalize",<br>
+                           "unable to legalize instruction", MI);<br>
+        return false;<br>
+      }<br>
+      Changed |= Res == LegalizerHelper::Legalized;<br>
+    }<br>
+    while (!ArtifactList.empty()) {<br>
+      MachineInstr &MI = *ArtifactList.pop_back_val();<br>
+      assert(isPreISelGenericOpcode(<wbr>MI.getOpcode()) && "Expecting generic opcode");<br>
+      if (isTriviallyDead(MI, MRI)) {<br>
+        DEBUG(dbgs() << MI << "Is dead; erasing.\n");<br>
+        RemoveDeadInstFromLists(&MI);<br>
+        MI.<wbr>eraseFromParentAndMarkDBGValue<wbr>sForRemoval();<br>
+        continue;<br>
+      }<br>
+      SmallVector<MachineInstr *, 4> DeadInstructions;<br>
+      if (ArtCombiner.<wbr>tryCombineInstruction(MI, DeadInstructions)) {<br>
+        for (auto *DeadMI : DeadInstructions) {<br>
+          DEBUG(dbgs() << ".. Erasing Dead Instruction " << *DeadMI);<br>
+          RemoveDeadInstFromLists(<wbr>DeadMI);<br>
+          DeadMI-><wbr>eraseFromParentAndMarkDBGValue<wbr>sForRemoval();<br>
+        }<br>
+        Changed = true;<br>
+        continue;<br>
+      }<br>
+      // If this was not an artifact (that could be combined away), this might<br>
+      // need special handling. Add it to InstList, so when it's processed<br>
+      // there, it has to be legal or specially handled.<br>
+      else<br>
+        InstList.insert(&MI);<br>
     }<br>
+  } while (!InstList.empty());<br>
+<br>
+  // For now don't support if new blocks are inserted - we would need to fix the<br>
+  // outerloop for that.<br>
+  if (MF.size() != NumBlocks) {<br>
+    MachineOptimizationRemarkMisse<wbr>d R("gisel-legalize", "GISelFailure",<br>
+                                      MF.getFunction()-><wbr>getSubprogram(),<br>
+                                      /*MBB=*/nullptr);<br>
+    R << "inserting blocks is not supported yet";<br>
+    reportGISelFailure(MF, TPC, MORE, R);<br>
+    return false;<br>
   }<br>
<br>
   return Changed;<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/arm64-<wbr>fallback.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>arm64-fallback.ll?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/arm64-<wbr>fallback.ll (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/arm64-<wbr>fallback.ll Tue Nov 14 14:42:19 2017<br>
@@ -63,19 +63,21 @@ false:<br>
 }<br>
<br>
   ; General legalizer inability to handle types whose size wasn't a power of 2.<br>
-; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: %vreg1<def>(s42) = G_LOAD %vreg0; mem:LD6[%addr](align=8) (in function: odd_type)<br>
+; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: G_STORE %vreg1, %vreg0; mem:ST6[%addr](align=8) (in function: odd_type)<br>
 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for odd_type<br>
 ; FALLBACK-WITH-REPORT-OUT-<wbr>LABEL: odd_type:<br>
 define void @odd_type(i42* %addr) {<br>
   %val42 = load i42, i42* %addr<br>
+  store i42 %val42, i42* %addr<br>
   ret void<br>
 }<br>
<br>
-; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: %vreg1<def>(<7 x s32>) = G_LOAD %vreg0; mem:LD28[%addr](align=32) (in function: odd_vector)<br>
+; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: G_STORE %vreg1, %vreg0; mem:ST28[%addr](align=32) (in function: odd_vector)<br>
 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for odd_vector<br>
 ; FALLBACK-WITH-REPORT-OUT-<wbr>LABEL: odd_vector:<br>
 define void @odd_vector(<7 x i32>* %addr) {<br>
   %vec = load <7 x i32>, <7 x i32>* %addr<br>
+  store <7 x i32> %vec, <7 x i32>* %addr<br>
   ret void<br>
 }<br>
<br>
@@ -146,6 +148,7 @@ define void @vector_of_pointers_extracte<br>
<br>
 block:<br>
   %dummy = extractelement <2 x i16*> %vec, i32 0<br>
+  store i16* %dummy, i16** undef<br>
   ret void<br>
<br>
 end:<br>
@@ -153,7 +156,7 @@ end:<br>
   br label %block<br>
 }<br>
<br>
-; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: %vreg0<def>(<2 x p0>) = G_INSERT_VECTOR_ELT %vreg1, %vreg2, %vreg3; (in function: vector_of_pointers_<wbr>insertelement<br>
+; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: G_STORE %vreg0, %vreg4; mem:ST16[undef] (in function: vector_of_pointers_<wbr>insertelement)<br>
 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for vector_of_pointers_<wbr>insertelement<br>
 ; FALLBACK-WITH-REPORT-OUT-<wbr>LABEL: vector_of_pointers_<wbr>insertelement:<br>
 define void @vector_of_pointers_<wbr>insertelement() {<br>
@@ -161,6 +164,7 @@ define void @vector_of_pointers_insertel<br>
<br>
 block:<br>
   %dummy = insertelement <2 x i16*> %vec, i16* null, i32 0<br>
+  store <2 x i16*> %dummy, <2 x i16*>* undef<br>
   ret void<br>
<br>
 end:<br>
@@ -168,41 +172,44 @@ end:<br>
   br label %block<br>
 }<br>
<br>
-; FALLBACK-WITH-REPORT-ERR-G_<wbr>IMPLICIT_DEF-LEGALIZABLE: (FIXME: this is what is expected once we can legalize non-pow-of-2 G_IMPLICIT_DEF) remark: <unknown>:0:0: unable to legalize instruction: %vreg1<def>(s96) = G_INSERT %vreg2, %vreg0, 0; (in function: nonpow2_insertvalue_narrowing<br>
-; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: %vreg2<def>(s96) = G_IMPLICIT_DEF; (in function: nonpow2_insertvalue_narrowing<br>
+; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: G_STORE %vreg1, %vreg3; mem:ST12[undef](align=4) (in function: nonpow2_insertvalue_narrowing)<br>
 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for nonpow2_insertvalue_narrowing<br>
 ; FALLBACK-WITH-REPORT-OUT-<wbr>LABEL: nonpow2_insertvalue_narrowing:<br>
 %struct96 = type { float, float, float }<br>
 define void @nonpow2_insertvalue_<wbr>narrowing(float %a) {<br>
   %dummy = insertvalue %struct96 undef, float %a, 0<br>
+  store %struct96 %dummy, %struct96* undef<br>
   ret void<br>
 }<br>
<br>
-; FALLBACK-WITH-REPORT-ERR remark: <unknown>:0:0: unable to legalize instruction: %vreg3<def>(s96) = G_ADD %vreg2, %vreg2; (in function: nonpow2_add_narrowing<br>
+; FALLBACK-WITH-REPORT-ERR remark: <unknown>:0:0: unable to legalize instruction: G_STORE %vreg3, %vreg4; mem:ST12[undef](align=16) (in function: nonpow2_add_narrowing)<br>
 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for nonpow2_add_narrowing<br>
 ; FALLBACK-WITH-REPORT-OUT-<wbr>LABEL: nonpow2_add_narrowing:<br>
 define void @nonpow2_add_narrowing() {<br>
   %a = add i128 undef, undef<br>
   %b = trunc i128 %a to i96<br>
   %dummy = add i96 %b, %b<br>
+  store i96 %dummy, i96* undef<br>
   ret void<br>
 }<br>
<br>
-; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: %vreg3<def>(s96) = G_OR %vreg2, %vreg2; (in function: nonpow2_or_narrowing<br>
+; FALLBACK-WITH-REPORT-ERR remark: <unknown>:0:0: unable to legalize instruction: G_STORE %vreg3, %vreg4; mem:ST12[undef](align=16) (in function: nonpow2_add_narrowing)<br>
 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for nonpow2_or_narrowing<br>
 ; FALLBACK-WITH-REPORT-OUT-<wbr>LABEL: nonpow2_or_narrowing:<br>
 define void @nonpow2_or_narrowing() {<br>
   %a = add i128 undef, undef<br>
   %b = trunc i128 %a to i96<br>
   %dummy = or i96 %b, %b<br>
+  store i96 %dummy, i96* undef<br>
   ret void<br>
 }<br>
<br>
-; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: %vreg0<def>(s96) = G_LOAD %vreg1; mem:LD12[undef](align=16) (in function: nonpow2_load_narrowing<br>
+; FALLBACK-WITH-REPORT-ERR remark: <unknown>:0:0: unable to legalize instruction: G_STORE %vreg0, %vreg1; mem:ST12[undef](align=16) (in function: nonpow2_load_narrowing)<br>
 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for nonpow2_load_narrowing<br>
 ; FALLBACK-WITH-REPORT-OUT-<wbr>LABEL: nonpow2_load_narrowing:<br>
 define void @nonpow2_load_narrowing() {<br>
   %dummy = load i96, i96* undef<br>
+  store i96 %dummy, i96* undef<br>
   ret void<br>
 }<br>
<br>
@@ -216,7 +223,7 @@ define void @nonpow2_store_narrowing(i96<br>
   ret void<br>
 }<br>
<br>
-; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: %vreg0<def>(s96) = G_CONSTANT 0; (in function: nonpow2_constant_narrowing<br>
+; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: G_STORE %vreg0, %vreg1; mem:ST12[undef](align=16) (in function: nonpow2_constant_narrowing)<br>
 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for nonpow2_constant_narrowing<br>
 ; FALLBACK-WITH-REPORT-OUT-<wbr>LABEL: nonpow2_constant_narrowing:<br>
 define void @nonpow2_constant_narrowing() {<br>
@@ -227,10 +234,12 @@ define void @nonpow2_constant_narrowing(<br>
 ; Currently can't handle vector lengths that aren't an exact multiple of<br>
 ; natively supported vector lengths. Test that the fall-back works for those.<br>
 ; FALLBACK-WITH-REPORT-ERR-G_<wbr>IMPLICIT_DEF-LEGALIZABLE: (FIXME: this is what is expected once we can legalize non-pow-of-2 G_IMPLICIT_DEF) remark: <unknown>:0:0: unable to legalize instruction: %vreg1<def>(<7 x s64>) = G_ADD %vreg0, %vreg0; (in function: nonpow2_vector_add_<wbr>fewerelements<br>
-; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: %vreg0<def>(<7 x s64>) = G_IMPLICIT_DEF; (in function: nonpow2_vector_add_<wbr>fewerelements<br>
+; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: %vreg2<def>(s64) = G_EXTRACT_VECTOR_ELT %vreg1, %vreg3; (in function: nonpow2_vector_add_<wbr>fewerelements)<br>
 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for nonpow2_vector_add_<wbr>fewerelements<br>
 ; FALLBACK-WITH-REPORT-OUT-<wbr>LABEL: nonpow2_vector_add_<wbr>fewerelements:<br>
 define void @nonpow2_vector_add_<wbr>fewerelements() {<br>
   %dummy = add <7 x i64> undef, undef<br>
+  %ex = extractelement <7 x i64> %dummy, i64 0<br>
+  store i64 %ex, i64* undef<br>
   ret void<br>
 }<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>add.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-add.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-add.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>add.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>add.mir Tue Nov 14 14:42:19 2017<br>
@@ -1,4 +1,4 @@<br>
-# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
+# NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.<wbr>py<br>
 # RUN: llc -O0 -run-pass=legalizer -global-isel %s -o - | FileCheck %s<br>
<br>
 --- |<br>
@@ -28,16 +28,6 @@<br>
<br>
 ---<br>
 name:            test_scalar_add_big<br>
-registers:<br>
-  - { id: 0, class: _ }<br>
-  - { id: 1, class: _ }<br>
-  - { id: 2, class: _ }<br>
-  - { id: 3, class: _ }<br>
-  - { id: 4, class: _ }<br>
-  - { id: 5, class: _ }<br>
-  - { id: 6, class: _ }<br>
-  - { id: 7, class: _ }<br>
-  - { id: 8, class: _ }<br>
 body: |<br>
   bb.0.entry:<br>
     liveins: %x0, %x1, %x2, %x3<br>
@@ -53,14 +43,14 @@ body: |<br>
     ; CHECK: [[UADDE2:%[0-9]+]]:_(s64), [[UADDE3:%[0-9]+]]:_(s1) = G_UADDE [[COPY1]], [[COPY3]], [[UADDE1]]<br>
     ; CHECK: %x0 = COPY [[UADDE]](s64)<br>
     ; CHECK: %x1 = COPY [[UADDE2]](s64)<br>
-    %0(s64) = COPY %x0<br>
-    %1(s64) = COPY %x1<br>
-    %2(s64) = COPY %x2<br>
-    %3(s64) = COPY %x3<br>
-    %4(s128) = G_MERGE_VALUES %0, %1<br>
-    %5(s128) = G_MERGE_VALUES %2, %3<br>
-    %6(s128) = G_ADD %4, %5<br>
-    %7(s64), %8(s64) = G_UNMERGE_VALUES %6<br>
+    %0:_(s64) = COPY %x0<br>
+    %1:_(s64) = COPY %x1<br>
+    %2:_(s64) = COPY %x2<br>
+    %3:_(s64) = COPY %x3<br>
+    %4:_(s128) = G_MERGE_VALUES %0, %1<br>
+    %5:_(s128) = G_MERGE_VALUES %2, %3<br>
+    %6:_(s128) = G_ADD %4, %5<br>
+    %7:_(s64), %8:_(s64) = G_UNMERGE_VALUES %6<br>
     %x0 = COPY %7<br>
     %x1 = COPY %8<br>
 ...<br>
@@ -110,13 +100,6 @@ body: |<br>
<br>
 ---<br>
 name:            test_scalar_add_small<br>
-registers:<br>
-  - { id: 0, class: _ }<br>
-  - { id: 1, class: _ }<br>
-  - { id: 2, class: _ }<br>
-  - { id: 3, class: _ }<br>
-  - { id: 4, class: _ }<br>
-  - { id: 5, class: _ }<br>
 body: |<br>
   bb.0.entry:<br>
     liveins: %x0, %x1, %x2, %x3<br>
@@ -127,30 +110,19 @@ body: |<br>
     ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
     ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)<br>
     ; CHECK: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[TRUNC]], [[TRUNC1]]<br>
-    ; CHECK: [[TRUNC2:%[0-9]+]]:_(s8) = G_TRUNC [[ADD]](s32)<br>
-    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[TRUNC2]](s8)<br>
+    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[ADD]](s32)<br>
     ; CHECK: %x0 = COPY [[ANYEXT]](s64)<br>
-    %0(s64) = COPY %x0<br>
-    %1(s64) = COPY %x1<br>
-    %2(s8) = G_TRUNC %0<br>
-    %3(s8) = G_TRUNC %1<br>
-    %4(s8) = G_ADD %2, %3<br>
-    %5(s64) = G_ANYEXT %4<br>
+    %0:_(s64) = COPY %x0<br>
+    %1:_(s64) = COPY %x1<br>
+    %2:_(s8) = G_TRUNC %0<br>
+    %3:_(s8) = G_TRUNC %1<br>
+    %4:_(s8) = G_ADD %2, %3<br>
+    %5:_(s64) = G_ANYEXT %4<br>
     %x0 = COPY %5<br>
 ...<br>
<br>
 ---<br>
 name:            test_vector_add<br>
-registers:<br>
-  - { id: 0, class: _ }<br>
-  - { id: 1, class: _ }<br>
-  - { id: 2, class: _ }<br>
-  - { id: 3, class: _ }<br>
-  - { id: 4, class: _ }<br>
-  - { id: 5, class: _ }<br>
-  - { id: 6, class: _ }<br>
-  - { id: 7, class: _ }<br>
-  - { id: 8, class: _ }<br>
 body: |<br>
   bb.0.entry:<br>
     liveins: %q0, %q1, %q2, %q3<br>
@@ -164,14 +136,14 @@ body: |<br>
     ; CHECK: [[ADD1:%[0-9]+]]:_(<2 x s64>) = G_ADD [[COPY1]], [[COPY3]]<br>
     ; CHECK: %q0 = COPY [[ADD]](<2 x s64>)<br>
     ; CHECK: %q1 = COPY [[ADD1]](<2 x s64>)<br>
-    %0(<2 x s64>) = COPY %q0<br>
-    %1(<2 x s64>) = COPY %q1<br>
-    %2(<2 x s64>) = COPY %q2<br>
-    %3(<2 x s64>) = COPY %q3<br>
-    %4(<4 x s64>) = G_MERGE_VALUES %0, %1<br>
-    %5(<4 x s64>) = G_MERGE_VALUES %2, %3<br>
-    %6(<4 x s64>) = G_ADD %4, %5<br>
-    %7(<2 x s64>), %8(<2 x s64>) = G_UNMERGE_VALUES %6<br>
+    %0:_(<2 x s64>) = COPY %q0<br>
+    %1:_(<2 x s64>) = COPY %q1<br>
+    %2:_(<2 x s64>) = COPY %q2<br>
+    %3:_(<2 x s64>) = COPY %q3<br>
+    %4:_(<4 x s64>) = G_MERGE_VALUES %0, %1<br>
+    %5:_(<4 x s64>) = G_MERGE_VALUES %2, %3<br>
+    %6:_(<4 x s64>) = G_ADD %4, %5<br>
+    %7:_(<2 x s64>), %8:_(<2 x s64>) = G_UNMERGE_VALUES %6<br>
     %q0 = COPY %7<br>
     %q1 = COPY %8<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>and.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-and.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-and.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>and.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>and.mir Tue Nov 14 14:42:19 2017<br>
@@ -19,6 +19,7 @@ registers:<br>
   - { id: 3, class: _ }<br>
   - { id: 4, class: _ }<br>
   - { id: 5, class: _ }<br>
+  - { id: 6, class: _ }<br>
 body: |<br>
   bb.0.entry:<br>
     liveins: %x0, %x1, %x2, %x3<br>
@@ -26,18 +27,20 @@ body: |<br>
     ; CHECK-LABEL: name: test_scalar_and_small<br>
     ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
     ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY %x1<br>
-    ; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s64)<br>
-    ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
-    ; CHECK: [[TRUNC2:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)<br>
-    ; CHECK: [[AND:%[0-9]+]]:_(s32) = G_AND [[TRUNC1]], [[TRUNC2]]<br>
-    ; CHECK: [[TRUNC3:%[0-9]+]]:_(s8) = G_TRUNC [[AND]](s32)<br>
-    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[TRUNC]](s8)<br>
-    ; CHECK: %x0 = COPY [[ANYEXT]](s64)<br>
+    ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)<br>
+    ; CHECK: [[AND:%[0-9]+]]:_(s32) = G_AND [[TRUNC]], [[TRUNC1]]<br>
+    ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[AND]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY2]](s32)<br>
+    ; CHECK: [[COPY3:%[0-9]+]]:_(s64) = COPY [[COPY]](s64)<br>
+    ; CHECK: %x0 = COPY [[COPY3]](s64)<br>
     %0(s64) = COPY %x0<br>
     %1(s64) = COPY %x1<br>
     %2(s8) = G_TRUNC %0<br>
     %3(s8) = G_TRUNC %1<br>
     %4(s8) = G_AND %2, %3<br>
+    %6(s32) = G_ANYEXT %4<br>
+    %w0 = COPY %6<br>
     %5(s64) = G_ANYEXT %2<br>
     %x0 = COPY %5<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>cmp.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-cmp.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-cmp.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>cmp.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>cmp.mir Tue Nov 14 14:42:19 2017<br>
@@ -1,3 +1,4 @@<br>
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
 # RUN: llc -O0 -run-pass=legalizer -global-isel %s -o - | FileCheck %s<br>
<br>
 --- |<br>
@@ -23,29 +24,48 @@ registers:<br>
   - { id: 8, class: _ }<br>
   - { id: 9, class: _ }<br>
   - { id: 10, class: _ }<br>
+  - { id: 11, class: _ }<br>
+  - { id: 12, class: _ }<br>
+  - { id: 13, class: _ }<br>
+  - { id: 14, class: _ }<br>
 body: |<br>
   bb.0.entry:<br>
     liveins: %x0, %x1, %x2, %x3<br>
+    ; CHECK-LABEL: name: test_icmp<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY %x0<br>
+    ; CHECK: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(sge), [[COPY]](s64), [[COPY1]]<br>
+    ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[ICMP]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY2]](s32)<br>
+    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 255<br>
+    ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: [[AND:%[0-9]+]]:_(s32) = G_AND [[TRUNC]], [[C]]<br>
+    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 255<br>
+    ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)<br>
+    ; CHECK: [[AND1:%[0-9]+]]:_(s32) = G_AND [[TRUNC1]], [[C1]]<br>
+    ; CHECK: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[AND]](s32), [[AND1]]<br>
+    ; CHECK: [[COPY3:%[0-9]+]]:_(s32) = COPY [[ICMP1]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY3]](s32)<br>
+    ; CHECK: [[INTTOPTR:%[0-9]+]]:_(p0) = G_INTTOPTR [[COPY]](s64)<br>
+    ; CHECK: [[ICMP2:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[INTTOPTR]](p0), [[INTTOPTR]]<br>
+    ; CHECK: [[COPY4:%[0-9]+]]:_(s32) = COPY [[ICMP2]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY4]](s32)<br>
     %0(s64) = COPY %x0<br>
     %1(s64) = COPY %x0<br>
<br>
     %2(s8) = G_TRUNC %0<br>
     %3(s8) = G_TRUNC %1<br>
<br>
-    ; CHECK: [[CMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(sge), %0(s64), %1<br>
-    ; CHECK: [[CMP_T1:%[0-9]+]]:_(s1) = G_TRUNC [[CMP1]]<br>
     %4(s1) = G_ICMP intpred(sge), %0, %1<br>
+    %11(s32) = G_ANYEXT %4<br>
+    %w0 = COPY %11<br>
<br>
-    ; CHECK: [[CSTMASK1:%[0-9]+]]:_(s32) = G_CONSTANT i32 255<br>
-    ; CHECK: [[T1:%[0-9]+]]:_(s32) = G_TRUNC %0(s64)<br>
-    ; CHECK: [[AND1:%[0-9]+]]:_(s32) = G_AND [[T1]], [[CSTMASK1]]<br>
-    ; CHECK: [[CSTMASK2:%[0-9]+]]:_(s32) = G_CONSTANT i32 255<br>
-    ; CHECK: [[T2:%[0-9]+]]:_(s32) = G_TRUNC %1(s64)<br>
-    ; CHECK: [[AND2:%[0-9]+]]:_(s32) = G_AND [[T2]], [[CSTMASK2]]<br>
-    ; CHECK: [[CMP2:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[AND1]](s32), [[AND2]]<br>
-    ; CHECK: [[CMP_T2:%[0-9]+]]:_(s1) = G_TRUNC [[CMP2]]<br>
     %8(s1) = G_ICMP intpred(ult), %2, %3<br>
+    %12(s32) = G_ANYEXT %8<br>
+    %w0 = COPY %12<br>
<br>
     %9(p0) = G_INTTOPTR %0(s64)<br>
     %10(s1) = G_ICMP intpred(eq), %9(p0), %9(p0)<br>
+    %14(s32) = G_ANYEXT %10<br>
+    %w0 = COPY %14<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>combines.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-combines.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-combines.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>combines.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>combines.mir Tue Nov 14 14:42:19 2017<br>
@@ -29,7 +29,10 @@ body: |<br>
     %1:_(s32) = G_ADD %0, %0<br>
     %2:_(s64) = G_MERGE_VALUES %0, %1<br>
     %3:_(s1) = G_EXTRACT %2, 0<br>
+    %5:_(s32) = G_ANYEXT %3<br>
+    %w0 = COPY %5<br>
     %4:_(s64) = G_EXTRACT %2, 0<br>
+    %x0 = COPY %4<br>
 ...<br>
<br>
 ---<br>
@@ -48,6 +51,7 @@ body: |<br>
     %2:_(s64) = G_MERGE_VALUES %0, %1<br>
     %3:_(s32), %4:_(s32) = G_UNMERGE_VALUES %2<br>
     %5:_(s32) = G_ADD %3, %4<br>
+    %w0 = COPY %5<br>
 ...<br>
<br>
 ---<br>
@@ -65,6 +69,7 @@ body: |<br>
     %1:_(s128) = G_MERGE_VALUES %0, %0<br>
     %2:_(s64) = G_EXTRACT %1, 0<br>
     %3:_(s64) = G_ADD %2, %2<br>
+    %w0 = COPY %3<br>
 ...<br>
<br>
 ---<br>
@@ -83,6 +88,7 @@ body: |<br>
     %2:_(s64) = G_MERGE_VALUES %0, %1<br>
     %3:_(s32), %4:_(s32) = G_UNMERGE_VALUES %2<br>
     %5:_(s32) = G_ADD %3, %4<br>
+    %w0 = COPY %5<br>
 ...<br>
<br>
 ---<br>
@@ -102,4 +108,5 @@ body: |<br>
     %2:_(s32) = G_UNMERGE_VALUES %1<br>
     %3:_(s32) = G_MUL %2, %2<br>
     %4:_(s32) = G_ADD %2, %3<br>
+    %w0 = COPY %4<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>constant.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-constant.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-constant.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>constant.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>constant.mir Tue Nov 14 14:42:19 2017<br>
@@ -30,20 +30,35 @@ body: |<br>
<br>
     ; CHECK-LABEL: name: test_constant<br>
     ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
-    ; CHECK: [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[C]](s32)<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY [[C]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY]](s32)<br>
     ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 42<br>
-    ; CHECK: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[C1]](s32)<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY [[C1]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY1]](s32)<br>
     ; CHECK: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1<br>
-    ; CHECK: [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[C2]](s32)<br>
+    ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[C2]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY2]](s32)<br>
     ; CHECK: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1<br>
+    ; CHECK: %w0 = COPY [[C3]](s32)<br>
     ; CHECK: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 1<br>
+    ; CHECK: %x0 = COPY [[C4]](s64)<br>
     ; CHECK: [[C5:%[0-9]+]]:_(s64) = G_CONSTANT i64 0<br>
+    ; CHECK: %x0 = COPY [[C5]](s64)<br>
     %0(s1) = G_CONSTANT i1 0<br>
+    %6:_(s32) = G_ANYEXT %0<br>
+    %w0 = COPY %6<br>
     %1(s8) = G_CONSTANT i8 42<br>
+    %7:_(s32) = G_ANYEXT %1<br>
+    %w0 = COPY %7<br>
     %2(s16) = G_CONSTANT i16 65535<br>
+    %8:_(s32) = G_ANYEXT %2<br>
+    %w0 = COPY %8<br>
     %3(s32) = G_CONSTANT i32 -1<br>
+    %w0 = COPY %3<br>
     %4(s64) = G_CONSTANT i64 1<br>
+    %x0 = COPY %4<br>
     %5(s64) = G_CONSTANT i64 0<br>
+    %x0 = COPY %5<br>
 ...<br>
<br>
 ---<br>
@@ -57,12 +72,20 @@ body: |<br>
<br>
     ; CHECK-LABEL: name: test_fconstant<br>
     ; CHECK: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.000000e+00<br>
+    ; CHECK: %w0 = COPY [[C]](s32)<br>
     ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00<br>
+    ; CHECK: %x0 = COPY [[C1]](s64)<br>
     ; CHECK: [[C2:%[0-9]+]]:_(s32) = G_FCONSTANT half 0xH0000<br>
     ; CHECK: [[FPTRUNC:%[0-9]+]]:_(s16) = G_FPTRUNC [[C2]](s32)<br>
+    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[FPTRUNC]](s16)<br>
+    ; CHECK: %w0 = COPY [[ANYEXT]](s32)<br>
     %0(s32) = G_FCONSTANT float 1.0<br>
+    %w0 = COPY %0<br>
     %1(s64) = G_FCONSTANT double 2.0<br>
+    %x0 = COPY %1<br>
     %2(s16) = G_FCONSTANT half 0.0<br>
+    %3:_(s32) = G_ANYEXT %2<br>
+    %w0 = COPY %3<br>
 ...<br>
<br>
 ---<br>
@@ -74,5 +97,9 @@ body: |<br>
<br>
     ; CHECK-LABEL: name: test_global<br>
     ; CHECK: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var<br>
+    ; CHECK: [[PTRTOINT:%[0-9]+]]:_(s64) = G_PTRTOINT [[GV]](p0)<br>
+    ; CHECK: %x0 = COPY [[PTRTOINT]](s64)<br>
     %0(p0) = G_GLOBAL_VALUE @var<br>
+    %1:_(s64) = G_PTRTOINT %0<br>
+    %x0 = COPY %1<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>div.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-div.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-div.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>div.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>div.mir Tue Nov 14 14:42:19 2017<br>
@@ -1,3 +1,4 @@<br>
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
 # RUN: llc -O0 -run-pass=legalizer -global-isel %s -o - | FileCheck %s<br>
<br>
 --- |<br>
@@ -21,35 +22,42 @@ registers:<br>
 body: |<br>
   bb.0.entry:<br>
     liveins: %x0, %x1, %x2, %x3<br>
+    ; CHECK-LABEL: name: test_div<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY %x1<br>
+    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24<br>
+    ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[TRUNC]], [[C]]<br>
+    ; CHECK: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]]<br>
+    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24<br>
+    ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)<br>
+    ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[TRUNC1]], [[C1]]<br>
+    ; CHECK: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[SHL1]], [[C1]]<br>
+    ; CHECK: [[SDIV:%[0-9]+]]:_(s32) = G_SDIV [[ASHR]], [[ASHR1]]<br>
+    ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[SDIV]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY2]](s32)<br>
+    ; CHECK: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 255<br>
+    ; CHECK: [[TRUNC2:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: [[AND:%[0-9]+]]:_(s32) = G_AND [[TRUNC2]], [[C2]]<br>
+    ; CHECK: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 255<br>
+    ; CHECK: [[TRUNC3:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)<br>
+    ; CHECK: [[AND1:%[0-9]+]]:_(s32) = G_AND [[TRUNC3]], [[C3]]<br>
+    ; CHECK: [[UDIV:%[0-9]+]]:_(s32) = G_UDIV [[AND]], [[AND1]]<br>
+    ; CHECK: [[COPY3:%[0-9]+]]:_(s32) = COPY [[UDIV]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY3]](s32)<br>
     %0(s64) = COPY %x0<br>
     %1(s64) = COPY %x1<br>
     %2(s8) = G_TRUNC %0<br>
     %3(s8) = G_TRUNC %1<br>
<br>
-    ; CHECK: [[A:%.*]]:_(s64) = COPY %x0<br>
-    ; CHECK: [[B:%.*]]:_(s64) = COPY %x1<br>
-    ; CHECK: [[C1:%.*]]:_(s32) = G_CONSTANT i32 24<br>
-    ; CHECK: [[S1:%.*]]:_(s32) = G_TRUNC [[A]]<br>
-    ; CHECK: [[SHL1:%.*]]:_(s32) = G_SHL [[S1]], [[C1]]<br>
-    ; CHECK: [[SEXT1:%.*]]:_(s32) = G_ASHR [[SHL1]], [[C1]]<br>
-    ; CHECK: [[C2:%.*]]:_(s32) = G_CONSTANT i32 24<br>
-    ; CHECK: [[S2:%.*]]:_(s32) = G_TRUNC [[B]]<br>
-    ; CHECK: [[SHL2:%.*]]:_(s32) = G_SHL [[S2]], [[C2]]<br>
-    ; CHECK: [[SEXT2:%.*]]:_(s32) = G_ASHR [[SHL2]], [[C2]]<br>
-    ; CHECK: [[DIV:%.*]]:_(s32) = G_SDIV [[SEXT1]], [[SEXT2]]<br>
-    ; CHECK: [[RES:%.*]]:_(s8) = G_TRUNC [[DIV]]<br>
<br>
     %4(s8) = G_SDIV %2, %3<br>
+    %6:_(s32) = G_ANYEXT %4<br>
+    %w0 = COPY %6<br>
<br>
<br>
-    ; CHECK: [[CMASK1:%.*]]:_(s32) = G_CONSTANT i32 255<br>
-    ; CHECK: [[T1:%.*]]:_(s32) = G_TRUNC [[A]]<br>
-    ; CHECK: [[LHS32:%.*]]:_(s32) = G_AND [[T1]], [[CMASK1]]<br>
-    ; CHECK: [[CMASK2:%.*]]:_(s32) = G_CONSTANT i32 255<br>
-    ; CHECK: [[T2:%.*]]:_(s32) = G_TRUNC [[B]]<br>
-    ; CHECK: [[RHS32:%.*]]:_(s32) = G_AND [[T2]], [[CMASK2]]<br>
-    ; CHECK: [[QUOT32:%[0-9]+]]:_(s32) = G_UDIV [[LHS32]], [[RHS32]]<br>
-    ; CHECK: [[RES:%[0-9]+]]:_(s8) = G_TRUNC [[QUOT32]]<br>
     %5(s8) = G_UDIV %2, %3<br>
+    %7:_(s32) = G_ANYEXT %5<br>
+    %w0 = COPY %7<br>
<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>ext.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-ext.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-ext.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>ext.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>ext.mir Tue Nov 14 14:42:19 2017<br>
@@ -1,3 +1,4 @@<br>
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
 # RUN: llc -O0 -run-pass=legalizer -global-isel %s -o - | FileCheck %s<br>
<br>
 --- |<br>
@@ -34,46 +35,109 @@ registers:<br>
 body: |<br>
   bb.0.entry:<br>
     liveins: %x0, %x1, %x2, %x3<br>
+    ; CHECK-LABEL: name: test_ext<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
+    ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: %w0 = COPY [[TRUNC]](s32)<br>
+    ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: %w0 = COPY [[TRUNC1]](s32)<br>
+    ; CHECK: [[TRUNC2:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: %w0 = COPY [[TRUNC2]](s32)<br>
+    ; CHECK: [[TRUNC3:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: %w0 = COPY [[TRUNC3]](s32)<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY [[COPY]](s64)<br>
+    ; CHECK: %x0 = COPY [[COPY1]](s64)<br>
+    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 255<br>
+    ; CHECK: [[COPY2:%[0-9]+]]:_(s64) = COPY [[COPY]](s64)<br>
+    ; CHECK: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY2]], [[C]]<br>
+    ; CHECK: %x0 = COPY [[AND]](s64)<br>
+    ; CHECK: [[COPY3:%[0-9]+]]:_(s64) = COPY [[COPY]](s64)<br>
+    ; CHECK: %x0 = COPY [[COPY3]](s64)<br>
+    ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 32<br>
+    ; CHECK: [[COPY4:%[0-9]+]]:_(s64) = COPY [[COPY]](s64)<br>
+    ; CHECK: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[COPY4]], [[C1]]<br>
+    ; CHECK: [[ASHR:%[0-9]+]]:_(s64) = G_ASHR [[SHL]], [[C1]]<br>
+    ; CHECK: %x0 = COPY [[ASHR]](s64)<br>
+    ; CHECK: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 31<br>
+    ; CHECK: [[TRUNC4:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[TRUNC4]], [[C2]]<br>
+    ; CHECK: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[SHL1]], [[C2]]<br>
+    ; CHECK: %w0 = COPY [[ASHR1]](s32)<br>
+    ; CHECK: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 255<br>
+    ; CHECK: [[TRUNC5:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: [[AND1:%[0-9]+]]:_(s32) = G_AND [[TRUNC5]], [[C3]]<br>
+    ; CHECK: %w0 = COPY [[AND1]](s32)<br>
+    ; CHECK: [[TRUNC6:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: %w0 = COPY [[TRUNC6]](s32)<br>
+    ; CHECK: [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; CHECK: [[TRUNC7:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: [[AND2:%[0-9]+]]:_(s32) = G_AND [[TRUNC7]], [[C4]]<br>
+    ; CHECK: %w0 = COPY [[AND2]](s32)<br>
+    ; CHECK: [[TRUNC8:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: %w0 = COPY [[TRUNC8]](s32)<br>
+    ; CHECK: [[C5:%[0-9]+]]:_(s32) = G_CONSTANT i32 16<br>
+    ; CHECK: [[TRUNC9:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: [[SHL2:%[0-9]+]]:_(s32) = G_SHL [[TRUNC9]], [[C5]]<br>
+    ; CHECK: [[ASHR2:%[0-9]+]]:_(s32) = G_ASHR [[SHL2]], [[C5]]<br>
+    ; CHECK: %w0 = COPY [[ASHR2]](s32)<br>
+    ; CHECK: [[C6:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; CHECK: [[TRUNC10:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: [[COPY5:%[0-9]+]]:_(s32) = COPY [[TRUNC3]]4(s32)<br>
+    ; CHECK: [[AND3:%[0-9]+]]:_(s32) = G_AND [[TRUNC3]]1, [[TRUNC3]]2<br>
+    ; CHECK: [[COPY6:%[0-9]+]]:_(s32) = COPY [[TRUNC3]]3(s32)<br>
+    ; CHECK: %w0 = COPY [[COPY6]](s32)<br>
+    ; CHECK: [[TRUNC11:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: %w0 = COPY [[TRUNC11]](s32)<br>
+    ; CHECK: [[TRUNC12:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: %w0 = COPY [[TRUNC12]](s32)<br>
+    ; CHECK: [[FPEXT:%[0-9]+]]:_(s64) = G_FPEXT [[TRUNC12]](s32)<br>
+    ; CHECK: %x0 = COPY [[FPEXT]](s64)<br>
     %0(s64) = COPY %x0<br>
<br>
-    ; CHECK: %1:_(s1) = G_TRUNC %0<br>
-    ; CHECK: %2:_(s8) = G_TRUNC %0<br>
-    ; CHECK: %3:_(s16) = G_TRUNC %0<br>
-    ; CHECK: %4:_(s32) = G_TRUNC %0<br>
     %1(s1) = G_TRUNC %0<br>
+    %19:_(s32) = G_ANYEXT %1<br>
+    %w0 = COPY %19<br>
     %2(s8) = G_TRUNC %0<br>
+    %20:_(s32) = G_ANYEXT %2<br>
+    %w0 = COPY %20<br>
     %3(s16) = G_TRUNC %0<br>
+    %21:_(s32) = G_ANYEXT %3<br>
+    %w0 = COPY %21<br>
     %4(s32) = G_TRUNC %0<br>
+    %w0 = COPY %4<br>
<br>
-    ; CHECK: %5:_(s64) = G_ANYEXT %1<br>
-    ; CHECK: %6:_(s64) = G_ZEXT %2<br>
-    ; CHECK: %7:_(s64) = G_ANYEXT %3<br>
-    ; CHECK: %8:_(s64) = G_SEXT %4<br>
     %5(s64) = G_ANYEXT %1<br>
+    %x0 = COPY %5<br>
     %6(s64) = G_ZEXT %2<br>
+    %x0 = COPY %6<br>
     %7(s64) = G_ANYEXT %3<br>
+    %x0 = COPY %7<br>
     %8(s64) = G_SEXT %4<br>
+    %x0 = COPY %8<br>
<br>
-    ; CHECK: %9:_(s32) = G_SEXT %1<br>
-    ; CHECK: %10:_(s32) = G_ZEXT %2<br>
-    ; CHECK: %11:_(s32) = G_ANYEXT %3<br>
     %9(s32) = G_SEXT %1<br>
+    %w0 = COPY %9<br>
     %10(s32) = G_ZEXT %2<br>
+    %w0 = COPY %10<br>
     %11(s32) = G_ANYEXT %3<br>
+    %w0 = COPY %11<br>
<br>
-    ; CHECK: %12:_(s32) = G_ZEXT %1<br>
-    ; CHECK: %13:_(s32) = G_ANYEXT %2<br>
-    ; CHECK: %14:_(s32) = G_SEXT %3<br>
     %12(s32) = G_ZEXT %1<br>
+    %w0 = COPY %12<br>
     %13(s32) = G_ANYEXT %2<br>
+    %w0 = COPY %13<br>
     %14(s32) = G_SEXT %3<br>
+    %w0 = COPY %14<br>
<br>
-    ; CHECK: %15:_(s8) = G_ZEXT %1<br>
-    ; CHECK: %16:_(s16) = G_ANYEXT %2<br>
     %15(s8) = G_ZEXT %1<br>
+    %22:_(s32) = G_ANYEXT %15<br>
+    %w0 = COPY %22<br>
     %16(s16) = G_ANYEXT %2<br>
+    %23:_(s32) = G_ANYEXT %16<br>
+    %w0 = COPY %23<br>
<br>
-    ; CHECK: %18:_(s64) = G_FPEXT %17<br>
     %17(s32) = G_TRUNC  %0<br>
+    %w0 = COPY %17<br>
     %18(s64) = G_FPEXT %17<br>
+    %x0 = COPY %18<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>extracts.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-extracts.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-extracts.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>extracts.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>extracts.mir Tue Nov 14 14:42:19 2017<br>
@@ -11,15 +11,13 @@ body: |<br>
     ; value stored is forwarded directly from first load.<br>
<br>
     ; CHECK-LABEL: name: test_extracts_1<br>
-    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
-    ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY %w1<br>
-    ; CHECK: [[COPY2:%[0-9]+]]:_(p0) = COPY %x2<br>
-    ; CHECK: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[COPY2]](p0) :: (load 16)<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY %x2<br>
+    ; CHECK: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[COPY]](p0) :: (load 16)<br>
     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 8<br>
-    ; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[COPY2]], [[C]](s64)<br>
+    ; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C]](s64)<br>
     ; CHECK: [[LOAD1:%[0-9]+]]:_(s64) = G_LOAD [[GEP]](p0) :: (load 16)<br>
-    ; CHECK: [[COPY3:%[0-9]+]]:_(s64) = COPY [[LOAD]](s64)<br>
-    ; CHECK: G_STORE [[COPY3]](s64), [[COPY2]](p0) :: (store 8)<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY [[LOAD]](s64)<br>
+    ; CHECK: G_STORE [[COPY1]](s64), [[COPY]](p0) :: (store 8)<br>
     ; CHECK: RET_ReallyLR<br>
     %0:_(s64) = COPY %x0<br>
     %1:_(s32) = COPY %w1<br>
@@ -38,18 +36,16 @@ body: |<br>
<br>
       ; Low extraction wipes takes whole low register. High extraction is real.<br>
     ; CHECK-LABEL: name: test_extracts_2<br>
-    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
-    ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY %w1<br>
-    ; CHECK: [[COPY2:%[0-9]+]]:_(p0) = COPY %x2<br>
-    ; CHECK: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[COPY2]](p0) :: (load 16)<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY %x2<br>
+    ; CHECK: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[COPY]](p0) :: (load 16)<br>
     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 8<br>
-    ; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[COPY2]], [[C]](s64)<br>
+    ; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C]](s64)<br>
     ; CHECK: [[LOAD1:%[0-9]+]]:_(s64) = G_LOAD [[GEP]](p0) :: (load 16)<br>
-    ; CHECK: [[COPY3:%[0-9]+]]:_(s64) = COPY [[LOAD]](s64)<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY [[LOAD]](s64)<br>
     ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[LOAD1]](s64), 0<br>
-    ; CHECK: [[COPY4:%[0-9]+]]:_(s32) = COPY [[EXTRACT]](s32)<br>
-    ; CHECK: G_STORE [[COPY3]](s64), [[COPY2]](p0) :: (store 8)<br>
-    ; CHECK: G_STORE [[COPY4]](s32), [[COPY2]](p0) :: (store 4)<br>
+    ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[EXTRACT]](s32)<br>
+    ; CHECK: G_STORE [[COPY1]](s64), [[COPY]](p0) :: (store 8)<br>
+    ; CHECK: G_STORE [[COPY2]](s32), [[COPY]](p0) :: (store 4)<br>
     ; CHECK: RET_ReallyLR<br>
     %0:_(s64) = COPY %x0<br>
     %1:_(s32) = COPY %w1<br>
@@ -75,11 +71,13 @@ body: |<br>
     ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](s64), 32<br>
     ; CHECK: [[EXTRACT1:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY1]](s64), 0<br>
     ; CHECK: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[EXTRACT]](s32), [[EXTRACT1]](s32)<br>
+    ; CHECK: %x0 = COPY [[MV]](s64)<br>
     ; CHECK: RET_ReallyLR<br>
     %0:_(s64) = COPY %x0<br>
     %1:_(s64) = COPY %x1<br>
     %2:_(s128) = G_MERGE_VALUES %0, %1<br>
     %3:_(s64) = G_EXTRACT %2, 32<br>
+    %x0 = COPY %3<br>
     RET_ReallyLR<br>
 ...<br>
<br>
@@ -92,13 +90,14 @@ body: |<br>
<br>
     ; CHECK-LABEL: name: test_extracts_4<br>
     ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
-    ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY %x1<br>
     ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](s64), 32<br>
-    ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[EXTRACT]](s32)<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY [[EXTRACT]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY1]](s32)<br>
     ; CHECK: RET_ReallyLR<br>
     %0:_(s64) = COPY %x0<br>
     %1:_(s64) = COPY %x1<br>
     %2:_(s128) = G_MERGE_VALUES %0, %1<br>
     %3:_(s32) = G_EXTRACT %2, 32<br>
+    %w0 = COPY %3<br>
     RET_ReallyLR<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>fcmp.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-fcmp.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-fcmp.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>fcmp.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>fcmp.mir Tue Nov 14 14:42:19 2017<br>
@@ -1,3 +1,4 @@<br>
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
 # RUN: llc -O0 -run-pass=legalizer -global-isel %s -o - | FileCheck %s<br>
<br>
 --- |<br>
@@ -23,19 +24,24 @@ registers:<br>
 body: |<br>
   bb.0.entry:<br>
     liveins: %x0, %x1, %x2, %x3<br>
+    ; CHECK-LABEL: name: test_icmp<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY %x0<br>
+    ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)<br>
+    ; CHECK: [[FCMP:%[0-9]+]]:_(s32) = G_FCMP floatpred(oge), [[COPY]](s64), [[COPY1]]<br>
+    ; CHECK: %w0 = COPY [[FCMP]](s32)<br>
+    ; CHECK: [[FCMP1:%[0-9]+]]:_(s32) = G_FCMP floatpred(uno), [[TRUNC]](s32), [[TRUNC1]]<br>
+    ; CHECK: %w0 = COPY [[FCMP1]](s32)<br>
     %0(s64) = COPY %x0<br>
     %1(s64) = COPY %x0<br>
<br>
     %2(s32) = G_TRUNC %0<br>
     %3(s32) = G_TRUNC %1<br>
<br>
-    ; CHECK: [[CMP1:%[0-9]+]]:_(s32) = G_FCMP floatpred(oge), %0(s64), %1<br>
-    ; CHECK: [[TRUNC1:%[0-9]+]]:_(s1) = G_TRUNC [[CMP1]]<br>
     %4(s32) = G_FCMP floatpred(oge), %0, %1<br>
-    %6(s1) = G_TRUNC %4(s32)<br>
+    %w0 = COPY %4<br>
<br>
-    ; CHECK: [[CMP2:%[0-9]+]]:_(s32) = G_FCMP floatpred(uno), %2(s32), %3<br>
-    ; CHECK: [[TRUNC2:%[0-9]+]]:_(s1) = G_TRUNC [[CMP2]]<br>
     %5(s32) = G_FCMP floatpred(uno), %2, %3<br>
-    %7(s1) = G_TRUNC %5(s32)<br>
+    %w0 = COPY %5<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>fptoi.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-fptoi.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-fptoi.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>fptoi.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>fptoi.mir Tue Nov 14 14:42:19 2017<br>
@@ -31,10 +31,12 @@ body: |<br>
   bb.0:<br>
     liveins: %w0<br>
     ; CHECK-LABEL: name: test_fptosi_s32_s32<br>
-    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY %w0<br>
-    ; CHECK: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY]](s32)<br>
-    %0:_(s32) = COPY %w0<br>
+    ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF<br>
+    ; CHECK: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[DEF]](s32)<br>
+    ; CHECK: %w0 = COPY [[FPTOSI]](s32)<br>
+    %0:_(s32) = G_IMPLICIT_DEF<br>
     %1:_(s32) = G_FPTOSI %0<br>
+    %w0 = COPY %1<br>
 ...<br>
<br>
 ---<br>
@@ -43,10 +45,12 @@ body: |<br>
   bb.0:<br>
     liveins: %w0<br>
     ; CHECK-LABEL: name: test_fptoui_s32_s32<br>
-    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY %w0<br>
-    ; CHECK: [[FPTOUI:%[0-9]+]]:_(s32) = G_FPTOUI [[COPY]](s32)<br>
-    %0:_(s32) = COPY %w0<br>
+    ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF<br>
+    ; CHECK: [[FPTOUI:%[0-9]+]]:_(s32) = G_FPTOUI [[DEF]](s32)<br>
+    ; CHECK: %w0 = COPY [[FPTOUI]](s32)<br>
+    %0:_(s32) = G_IMPLICIT_DEF<br>
     %1:_(s32) = G_FPTOUI %0<br>
+    %w0 = COPY %1<br>
 ...<br>
<br>
 ---<br>
@@ -55,10 +59,12 @@ body: |<br>
   bb.0:<br>
     liveins: %x0<br>
     ; CHECK-LABEL: name: test_fptosi_s32_s64<br>
-    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
-    ; CHECK: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY]](s64)<br>
-    %0:_(s64) = COPY %x0<br>
+    ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF<br>
+    ; CHECK: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[DEF]](s32)<br>
+    ; CHECK: %w0 = COPY [[FPTOSI]](s32)<br>
+    %0:_(s32) = G_IMPLICIT_DEF<br>
     %1:_(s32) = G_FPTOSI %0<br>
+    %w0 = COPY %1<br>
 ...<br>
<br>
 ---<br>
@@ -69,8 +75,10 @@ body: |<br>
     ; CHECK-LABEL: name: test_fptoui_s32_s64<br>
     ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
     ; CHECK: [[FPTOUI:%[0-9]+]]:_(s32) = G_FPTOUI [[COPY]](s64)<br>
+    ; CHECK: %w0 = COPY [[FPTOUI]](s32)<br>
     %0:_(s64) = COPY %x0<br>
     %1:_(s32) = G_FPTOUI %0<br>
+    %w0 = COPY %1<br>
 ...<br>
<br>
 ---<br>
@@ -81,8 +89,10 @@ body: |<br>
     ; CHECK-LABEL: name: test_fptosi_s64_s32<br>
     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY %w0<br>
     ; CHECK: [[FPTOSI:%[0-9]+]]:_(s64) = G_FPTOSI [[COPY]](s32)<br>
+    ; CHECK: %x0 = COPY [[FPTOSI]](s64)<br>
     %0:_(s32) = COPY %w0<br>
     %1:_(s64) = G_FPTOSI %0<br>
+    %x0 = COPY %1<br>
 ...<br>
<br>
 ---<br>
@@ -93,8 +103,10 @@ body: |<br>
     ; CHECK-LABEL: name: test_fptoui_s64_s32<br>
     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY %w0<br>
     ; CHECK: [[FPTOUI:%[0-9]+]]:_(s64) = G_FPTOUI [[COPY]](s32)<br>
+    ; CHECK: %x0 = COPY [[FPTOUI]](s64)<br>
     %0:_(s32) = COPY %w0<br>
     %1:_(s64) = G_FPTOUI %0<br>
+    %x0 = COPY %1<br>
 ...<br>
<br>
 ---<br>
@@ -105,8 +117,10 @@ body: |<br>
     ; CHECK-LABEL: name: test_fptosi_s64_s64<br>
     ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
     ; CHECK: [[FPTOSI:%[0-9]+]]:_(s64) = G_FPTOSI [[COPY]](s64)<br>
+    ; CHECK: %x0 = COPY [[FPTOSI]](s64)<br>
     %0:_(s64) = COPY %x0<br>
     %1:_(s64) = G_FPTOSI %0<br>
+    %x0 = COPY %1<br>
 ...<br>
<br>
 ---<br>
@@ -117,8 +131,10 @@ body: |<br>
     ; CHECK-LABEL: name: test_fptoui_s64_s64<br>
     ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
     ; CHECK: [[FPTOUI:%[0-9]+]]:_(s64) = G_FPTOUI [[COPY]](s64)<br>
+    ; CHECK: %x0 = COPY [[FPTOUI]](s64)<br>
     %0:_(s64) = COPY %x0<br>
     %1:_(s64) = G_FPTOUI %0<br>
+    %x0 = COPY %1<br>
 ...<br>
<br>
<br>
@@ -132,8 +148,10 @@ body: |<br>
     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY %w0<br>
     ; CHECK: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY]](s32)<br>
     ; CHECK: [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[FPTOSI]](s32)<br>
+    ; CHECK: %x0 = COPY [[TRUNC]](s1)<br>
     %0:_(s32) = COPY %w0<br>
     %1:_(s1) = G_FPTOSI %0<br>
+    %x0 = COPY %1<br>
 ...<br>
<br>
 ---<br>
@@ -144,9 +162,12 @@ body: |<br>
     ; CHECK-LABEL: name: test_fptoui_s1_s32<br>
     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY %w0<br>
     ; CHECK: [[FPTOUI:%[0-9]+]]:_(s32) = G_FPTOUI [[COPY]](s32)<br>
-    ; CHECK: [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[FPTOUI]](s32)<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY [[FPTOUI]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY1]](s32)<br>
     %0:_(s32) = COPY %w0<br>
     %1:_(s1) = G_FPTOUI %0<br>
+    %2:_(s32) = G_ANYEXT %1<br>
+    %w0 = COPY %2<br>
 ...<br>
<br>
 ---<br>
@@ -157,9 +178,12 @@ body: |<br>
     ; CHECK-LABEL: name: test_fptosi_s8_s64<br>
     ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
     ; CHECK: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY]](s64)<br>
-    ; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[FPTOSI]](s32)<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY [[FPTOSI]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY1]](s32)<br>
     %0:_(s64) = COPY %x0<br>
     %1:_(s8) = G_FPTOSI %0<br>
+    %2:_(s32) = G_ANYEXT %1<br>
+    %w0 = COPY %2<br>
 ...<br>
<br>
 ---<br>
@@ -170,9 +194,12 @@ body: |<br>
     ; CHECK-LABEL: name: test_fptoui_s8_s64<br>
     ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
     ; CHECK: [[FPTOUI:%[0-9]+]]:_(s32) = G_FPTOUI [[COPY]](s64)<br>
-    ; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[FPTOUI]](s32)<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY [[FPTOUI]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY1]](s32)<br>
     %0:_(s64) = COPY %x0<br>
     %1:_(s8) = G_FPTOUI %0<br>
+    %2:_(s32) = G_ANYEXT %1<br>
+    %w0 = COPY %2<br>
 ...<br>
<br>
 ---<br>
@@ -183,9 +210,12 @@ body: |<br>
     ; CHECK-LABEL: name: test_fptosi_s16_s32<br>
     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY %w0<br>
     ; CHECK: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY]](s32)<br>
-    ; CHECK: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[FPTOSI]](s32)<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY [[FPTOSI]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY1]](s32)<br>
     %0:_(s32) = COPY %w0<br>
     %1:_(s16) = G_FPTOSI %0<br>
+    %2:_(s32) = G_ANYEXT %1<br>
+    %w0 = COPY %2<br>
 ...<br>
<br>
 ---<br>
@@ -196,7 +226,10 @@ body: |<br>
     ; CHECK-LABEL: name: test_fptoui_s16_s32<br>
     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY %w0<br>
     ; CHECK: [[FPTOUI:%[0-9]+]]:_(s32) = G_FPTOUI [[COPY]](s32)<br>
-    ; CHECK: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[FPTOUI]](s32)<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY [[FPTOUI]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY1]](s32)<br>
     %0:_(s32) = COPY %w0<br>
     %1:_(s16) = G_FPTOUI %0<br>
+    %2:_(s32) = G_ANYEXT %1<br>
+    %w0 = COPY %2<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>inserts.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-inserts.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-inserts.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>inserts.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>inserts.mir Tue Nov 14 14:42:19 2017<br>
@@ -122,6 +122,8 @@ body: |<br>
     %2:_(s64) = COPY %x2<br>
     %3:_(s128) = G_MERGE_VALUES %0, %1<br>
     %4:_(s128) = G_INSERT %3, %2, 32<br>
+    %5:_(s64) = G_TRUNC %4<br>
+    %x0 = COPY %5<br>
     RET_ReallyLR<br>
 ...<br>
<br>
@@ -140,6 +142,8 @@ body: |<br>
     %2:_(s32) = COPY %w2<br>
     %3:_(s128) = G_MERGE_VALUES %0, %1<br>
     %4:_(s128) = G_INSERT %3, %2, 32<br>
+    %5:_(s64) = G_TRUNC %4<br>
+    %x0 = COPY %5<br>
     RET_ReallyLR<br>
 ...<br>
<br>
@@ -151,12 +155,15 @@ body: |<br>
<br>
<br>
     ; CHECK-LABEL: name: test_inserts_nonpow2<br>
-    ; CHECK: %5:_(s192) = G_MERGE_VALUES %3(s64), %1(s64), %2(s64)<br>
+    ; CHECK: [[C:%[0-9]+]]:_(s64) = COPY %x3<br>
+    ; CHECK: %x0 = COPY [[C]]<br>
     %0:_(s64) = COPY %x0<br>
     %1:_(s64) = COPY %x1<br>
     %2:_(s64) = COPY %x2<br>
     %3:_(s64) = COPY %x3<br>
     %4:_(s192) = G_MERGE_VALUES %0, %1, %2<br>
     %5:_(s192) = G_INSERT %4, %3, 0<br>
+    %6:_(s64), %7:_(s64), %8:_(s64) = G_UNMERGE_VALUES %5<br>
+    %x0 = COPY %6<br>
     RET_ReallyLR<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>itofp.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-itofp.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-itofp.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>itofp.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>itofp.mir Tue Nov 14 14:42:19 2017<br>
@@ -35,6 +35,7 @@ body: |<br>
     ; CHECK: [[SITOFP:%[0-9]+]]:_(s32) = G_SITOFP [[COPY]](s32)<br>
     %0:_(s32) = COPY %w0<br>
     %1:_(s32) = G_SITOFP %0<br>
+    %w0 = COPY %1<br>
 ...<br>
<br>
 ---<br>
@@ -47,6 +48,7 @@ body: |<br>
     ; CHECK: [[UITOFP:%[0-9]+]]:_(s32) = G_UITOFP [[COPY]](s32)<br>
     %0:_(s32) = COPY %w0<br>
     %1:_(s32) = G_UITOFP %0<br>
+    %w0 = COPY %1<br>
 ...<br>
<br>
 ---<br>
@@ -59,6 +61,7 @@ body: |<br>
     ; CHECK: [[SITOFP:%[0-9]+]]:_(s32) = G_SITOFP [[COPY]](s64)<br>
     %0:_(s64) = COPY %x0<br>
     %1:_(s32) = G_SITOFP %0<br>
+    %w0 = COPY %1<br>
 ...<br>
<br>
 ---<br>
@@ -71,6 +74,7 @@ body: |<br>
     ; CHECK: [[UITOFP:%[0-9]+]]:_(s32) = G_UITOFP [[COPY]](s64)<br>
     %0:_(s64) = COPY %x0<br>
     %1:_(s32) = G_UITOFP %0<br>
+    %w0 = COPY %1<br>
 ...<br>
<br>
 ---<br>
@@ -83,6 +87,7 @@ body: |<br>
     ; CHECK: [[SITOFP:%[0-9]+]]:_(s64) = G_SITOFP [[COPY]](s32)<br>
     %0:_(s32) = COPY %w0<br>
     %1:_(s64) = G_SITOFP %0<br>
+    %w0 = COPY %1<br>
 ...<br>
<br>
 ---<br>
@@ -95,6 +100,7 @@ body: |<br>
     ; CHECK: [[UITOFP:%[0-9]+]]:_(s64) = G_UITOFP [[COPY]](s32)<br>
     %0:_(s32) = COPY %w0<br>
     %1:_(s64) = G_UITOFP %0<br>
+    %x0 = COPY %1<br>
 ...<br>
<br>
 ---<br>
@@ -107,6 +113,7 @@ body: |<br>
     ; CHECK: [[SITOFP:%[0-9]+]]:_(s64) = G_SITOFP [[COPY]](s64)<br>
     %0:_(s64) = COPY %x0<br>
     %1:_(s64) = G_SITOFP %0<br>
+    %x0 = COPY %1<br>
 ...<br>
<br>
 ---<br>
@@ -119,6 +126,7 @@ body: |<br>
     ; CHECK: [[UITOFP:%[0-9]+]]:_(s64) = G_UITOFP [[COPY]](s64)<br>
     %0:_(s64) = COPY %x0<br>
     %1:_(s64) = G_UITOFP %0<br>
+    %x0 = COPY %1<br>
 ...<br>
<br>
<br>
@@ -137,6 +145,7 @@ body: |<br>
     %0:_(s32) = COPY %w0<br>
     %1:_(s1) = G_TRUNC %0<br>
     %2:_(s32) = G_SITOFP %1<br>
+    %w0 = COPY %2<br>
 ...<br>
<br>
 ---<br>
@@ -153,6 +162,7 @@ body: |<br>
     %0:_(s32) = COPY %w0<br>
     %1:_(s1) = G_TRUNC %0<br>
     %2:_(s32) = G_UITOFP %1<br>
+    %w0 = COPY %2<br>
 ...<br>
<br>
 ---<br>
@@ -170,6 +180,7 @@ body: |<br>
     %0:_(s32) = COPY %w0<br>
     %1:_(s8) = G_TRUNC %0<br>
     %2:_(s64) = G_SITOFP %1<br>
+    %x0 = COPY %2<br>
 ...<br>
<br>
 ---<br>
@@ -186,6 +197,7 @@ body: |<br>
     %0:_(s32) = COPY %w0<br>
     %1:_(s8) = G_TRUNC %0<br>
     %2:_(s64) = G_UITOFP %1<br>
+    %x0 = COPY %2<br>
 ...<br>
<br>
 ---<br>
@@ -203,6 +215,7 @@ body: |<br>
     %0:_(s32) = COPY %w0<br>
     %1:_(s16) = G_TRUNC %0<br>
     %2:_(s32) = G_SITOFP %1<br>
+    %w0 = COPY %2<br>
 ...<br>
<br>
 ---<br>
@@ -219,4 +232,5 @@ body: |<br>
     %0:_(s32) = COPY %w0<br>
     %1:_(s16) = G_TRUNC %0<br>
     %2:_(s32) = G_UITOFP %1<br>
+    %w0 = COPY %2<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>load-store.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-load-store.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-load-store.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>load-store.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>load-store.mir Tue Nov 14 14:42:19 2017<br>
@@ -31,27 +31,36 @@ body: |<br>
     ; CHECK-LABEL: name: test_load<br>
     %0(p0) = COPY %x0<br>
<br>
-    ; CHECK: [[BIT8:%[0-9]+]]:_(s8) = G_LOAD %0(p0) :: (load 1 from %ir.addr)<br>
-    ; CHECK: %1:_(s1) = G_TRUNC [[BIT8]]<br>
     %1(s1) = G_LOAD %0 :: (load 1 from %ir.addr)<br>
+    %9:_(s32) = G_ANYEXT %1<br>
+    %w0 = COPY %9<br>
<br>
     ; CHECK: %2:_(s8) = G_LOAD %0(p0) :: (load 1 from %ir.addr)<br>
     %2(s8) = G_LOAD %0 :: (load 1 from %ir.addr)<br>
+    %10:_(s32) = G_ANYEXT %2<br>
+    %w0 = COPY %10<br>
<br>
     ; CHECK: %3:_(s16) = G_LOAD %0(p0) :: (load 2 from %ir.addr)<br>
     %3(s16) = G_LOAD %0 :: (load 2 from %ir.addr)<br>
+    %11:_(s32) = G_ANYEXT %3<br>
+    %w0 = COPY %11<br>
<br>
     ; CHECK: %4:_(s32) = G_LOAD %0(p0) :: (load 4 from %ir.addr)<br>
     %4(s32) = G_LOAD %0 :: (load 4 from %ir.addr)<br>
+    %w0 = COPY %4<br>
<br>
     ; CHECK: %5:_(s64) = G_LOAD %0(p0) :: (load 8 from %ir.addr)<br>
     %5(s64) = G_LOAD %0 :: (load 8 from %ir.addr)<br>
+    %x0 = COPY %5<br>
<br>
-    ; CHECK: %6:_(p0) = G_LOAD %0(p0) :: (load 8 from %ir.addr)<br>
     %6(p0) = G_LOAD %0(p0) :: (load 8 from %ir.addr)<br>
+    %12:_(s64) = G_PTRTOINT %6<br>
+    %x0 = COPY %12<br>
<br>
     ; CHECK: %7:_(<2 x s32>) = G_LOAD %0(p0) :: (load 8 from %ir.addr)<br>
     %7(<2 x s32>) = G_LOAD %0(p0) :: (load 8 from %ir.addr)<br>
+    %13:_(s64) = G_BITCAST %7<br>
+    %x0 = COPY %13<br>
<br>
     ; CHECK: [[LOAD0:%[0-9]+]]:_(s64) = G_LOAD %0(p0) :: (load 16 from %ir.addr)<br>
     ; CHECK: [[OFFSET1:%[0-9]+]]:_(s64) = G_CONSTANT i64 8<br>
@@ -59,6 +68,8 @@ body: |<br>
     ; CHECK: [[LOAD1:%[0-9]+]]:_(s64) = G_LOAD [[GEP1]](p0) :: (load 16 from %ir.addr)<br>
     ; CHECK: %8:_(s128) = G_MERGE_VALUES [[LOAD0]](s64), [[LOAD1]](s64)<br>
     %8(s128) = G_LOAD %0(p0) :: (load 16 from %ir.addr)<br>
+    %14:_(s64) = G_TRUNC %8<br>
+    %x0 = COPY %14<br>
 ...<br>
<br>
 ---<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>mul.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-mul.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-mul.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>mul.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>mul.mir Tue Nov 14 14:42:19 2017<br>
@@ -30,8 +30,7 @@ body: |<br>
     ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
     ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)<br>
     ; CHECK: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[TRUNC]], [[TRUNC1]]<br>
-    ; CHECK: [[TRUNC2:%[0-9]+]]:_(s8) = G_TRUNC [[MUL]](s32)<br>
-    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[TRUNC2]](s8)<br>
+    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[MUL]](s32)<br>
     ; CHECK: %x0 = COPY [[ANYEXT]](s64)<br>
     %0(s64) = COPY %x0<br>
     %1(s64) = COPY %x1<br>
@@ -56,9 +55,14 @@ body: |<br>
     ; CHECK: [[SMULH:%[0-9]+]]:_(s64) = G_SMULH [[COPY]], [[COPY1]]<br>
     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0<br>
     ; CHECK: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ne), [[SMULH]](s64), [[C]]<br>
-    ; CHECK: [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP]](s32)<br>
+    ; CHECK: %x0 = COPY [[MUL]](s64)<br>
+    ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[ICMP]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY2]](s32)<br>
     %0:_(s64) = COPY %x0<br>
     %1:_(s64) = COPY %x1<br>
     %2:_(s64), %3:_(s1) = G_SMULO %0, %1<br>
+    %x0 = COPY %2<br>
+    %4:_(s32) = G_ANYEXT %3<br>
+    %w0 = COPY %4<br>
<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>nonpowerof2eltsvec.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-nonpowerof2eltsvec.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-nonpowerof2eltsvec.<wbr>mir?rev=318210&r1=318209&r2=<wbr>318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>nonpowerof2eltsvec.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>nonpowerof2eltsvec.mir Tue Nov 14 14:42:19 2017<br>
@@ -22,9 +22,15 @@ body: |<br>
     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY %w0<br>
     ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY %w1<br>
     ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY %w2<br>
-    ; CHECK: [[MV:%[0-9]+]]:_(<3 x s32>) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32), [[COPY2]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY]](s32)<br>
+    ; CHECK: %w1 = COPY [[COPY1]](s32)<br>
+    ; CHECK: %w2 = COPY [[COPY2]](s32)<br>
     %0(s32) = COPY %w0<br>
     %1(s32) = COPY %w1<br>
     %2(s32) = COPY %w2<br>
     %3(<3 x s32>) = G_MERGE_VALUES %0(s32), %1(s32), %2(s32)<br>
+    %4:_(s32), %5:_(s32), %6:_(s32) = G_UNMERGE_VALUES %3<br>
+    %w0 = COPY %4<br>
+    %w1 = COPY %5<br>
+    %w2 = COPY %6<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>or.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-or.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-or.mir?rev=318210&r1=<wbr>318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>or.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>or.mir Tue Nov 14 14:42:19 2017<br>
@@ -3,17 +3,9 @@<br>
<br>
 ---<br>
 name:            test_scalar_or_small<br>
-registers:<br>
-  - { id: 0, class: _ }<br>
-  - { id: 1, class: _ }<br>
-  - { id: 2, class: _ }<br>
-  - { id: 3, class: _ }<br>
-  - { id: 4, class: _ }<br>
-  - { id: 5, class: _ }<br>
 body: |<br>
   bb.0:<br>
     liveins: %x0, %x1, %x2, %x3<br>
-<br>
     ; CHECK-LABEL: name: test_scalar_or_small<br>
     ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
     ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY %x1<br>
@@ -21,29 +13,17 @@ body: |<br>
     ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)<br>
     ; CHECK: [[OR:%[0-9]+]]:_(s32) = G_OR [[TRUNC]], [[TRUNC1]]<br>
     ; CHECK: [[TRUNC2:%[0-9]+]]:_(s8) = G_TRUNC [[OR]](s32)<br>
-    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[TRUNC2]](s8)<br>
-    ; CHECK: %x0 = COPY [[ANYEXT]](s64)<br>
-    %0(s64) = COPY %x0<br>
-    %1(s64) = COPY %x1<br>
-    %2(s8) = G_TRUNC %0<br>
-    %3(s8) = G_TRUNC %1<br>
-    %4(s8) = G_OR %2, %3<br>
-    %5(s64) = G_ANYEXT %4<br>
-    %x0 = COPY %5<br>
+    ; CHECK: %x0 = COPY [[TRUNC2]](s8)<br>
+    %0:_(s64) = COPY %x0<br>
+    %1:_(s64) = COPY %x1<br>
+    %2:_(s8) = G_TRUNC %0<br>
+    %3:_(s8) = G_TRUNC %1<br>
+    %4:_(s8) = G_OR %2, %3<br>
+    %x0 = COPY %4<br>
 ...<br>
<br>
 ---<br>
 name:            test_big_scalar_power_of_2<br>
-registers:<br>
-  - { id: 0, class: _ }<br>
-  - { id: 1, class: _ }<br>
-  - { id: 2, class: _ }<br>
-  - { id: 3, class: _ }<br>
-  - { id: 4, class: _ }<br>
-  - { id: 5, class: _ }<br>
-  - { id: 6, class: _ }<br>
-  - { id: 7, class: _ }<br>
-  - { id: 8, class: _ }<br>
 body: |<br>
   bb.0:<br>
     liveins: %x0, %x1, %x2, %x3<br>
@@ -61,14 +41,14 @@ body: |<br>
     ; CHECK: %x0 = COPY [[OR]](s64)<br>
     ; CHECK: %x1 = COPY [[OR1]](s64)<br>
     ; CHECK: RET_ReallyLR implicit %x0, implicit %x1<br>
-    %0(s64) = COPY %x0<br>
-    %1(s64) = COPY %x1<br>
-    %2(s64) = COPY %x2<br>
-    %3(s64) = COPY %x3<br>
-    %4(s128) = G_MERGE_VALUES %0, %1<br>
-    %5(s128) = G_MERGE_VALUES %2, %3<br>
-    %6(s128) = G_OR %4, %5<br>
-    %7(s64), %8(s64) = G_UNMERGE_VALUES %6<br>
+    %0:_(s64) = COPY %x0<br>
+    %1:_(s64) = COPY %x1<br>
+    %2:_(s64) = COPY %x2<br>
+    %3:_(s64) = COPY %x3<br>
+    %4:_(s128) = G_MERGE_VALUES %0, %1<br>
+    %5:_(s128) = G_MERGE_VALUES %2, %3<br>
+    %6:_(s128) = G_OR %4, %5<br>
+    %7:_(s64), %8:_(s64) = G_UNMERGE_VALUES %6<br>
     %x0 = COPY %7<br>
     %x1 = COPY %8<br>
     RET_ReallyLR implicit %x0, implicit %x1<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>phi.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-phi.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-phi.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>phi.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>phi.mir Tue Nov 14 14:42:19 2017<br>
@@ -1,3 +1,4 @@<br>
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
 # RUN: llc -mtriple=aarch64-unknown-<wbr>unknown -global-isel -verify-machineinstrs -run-pass=legalizer %s -o - | FileCheck %s<br>
 --- |<br>
   ; ModuleID = '/tmp/test.ll'<br>
@@ -62,21 +63,39 @@ registers:<br>
   - { id: 10, class: _, preferred-register: '' }<br>
 liveins:<br>
 body:             |<br>
+  ; CHECK-LABEL: name: legalize_phi<br>
+  ; CHECK: bb.0:<br>
+  ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)<br>
+  ; CHECK:   liveins: %w0<br>
+  ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY %w0<br>
+  ; CHECK:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
+  ; CHECK:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+  ; CHECK:   [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 2<br>
+  ; CHECK:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[COPY]](s32), [[C]]<br>
+  ; CHECK:   [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP]](s32)<br>
+  ; CHECK:   G_BRCOND [[TRUNC]](s1), %bb.1<br>
+  ; CHECK:   G_BR %bb.2<br>
+  ; CHECK: bb.1:<br>
+  ; CHECK:   successors: %bb.3(0x80000000)<br>
+  ; CHECK:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C1]]<br>
+  ; CHECK:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ADD]](s32)<br>
+  ; CHECK:   G_BR %bb.3<br>
+  ; CHECK: bb.2:<br>
+  ; CHECK:   successors: %bb.3(0x80000000)<br>
+  ; CHECK:   [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C2]]<br>
+  ; CHECK:   [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[ADD1]](s32)<br>
+  ; CHECK: bb.3:<br>
+  ; CHECK:   [[PHI:%[0-9]+]]:_(s16) = G_PHI [[TRUNC1]](s16), %bb.1, [[TRUNC2]](s16), %bb.2<br>
+  ; CHECK:   [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+  ; CHECK:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI]](s16)<br>
+  ; CHECK:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ANYEXT]], [[C3]]<br>
+  ; CHECK:   %w0 = COPY [[AND]](s32)<br>
+  ; CHECK:   RET_ReallyLR implicit %w0<br>
   bb.0:<br>
    ; Test that we insert legalization artifacts(Truncs here) into the correct BBs<br>
    ; while legalizing the G_PHI to s16.<br>
-   ; CHECK-LABEL: name: legalize_phi<br>
-   ; CHECK-LABEL: bb.1:<br>
-   ; CHECK: [[ADD_BB1:%.*]]:_(s32) = G_ADD<br>
-   ; CHECK: [[RES_BB1:%.*]]:_(s16) = G_TRUNC [[ADD_BB1]]<br>
-<br>
-   ; CHECK-LABEL: bb.2:<br>
-   ; CHECK: [[ADD_BB2:%.*]]:_(s32) = G_ADD<br>
-   ; CHECK: [[RES_BB2:%.*]]:_(s16) = G_TRUNC [[ADD_BB2]]<br>
-<br>
-   ; CHECK-LABEL: bb.3:<br>
-   ; CHECK: [[RES_PHI:%.*]]:_(s16) = G_PHI [[RES_BB1]](s16), %bb.1, [[RES_BB2]](s16), %bb.2<br>
-   ; CHECK: [[RES:%.*]]:_(s1) = G_TRUNC [[RES_PHI]]<br>
+<br>
+<br>
     successors: %bb.1(0x40000000), %bb.2(0x40000000)<br>
     liveins: %w0<br>
<br>
@@ -125,18 +144,24 @@ registers:<br>
   - { id: 5, class: _, preferred-register: '' }<br>
 liveins:<br>
 body:             |<br>
+  ; CHECK-LABEL: name: legalize_phi_ptr<br>
+  ; CHECK: bb.0:<br>
+  ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)<br>
+  ; CHECK:   liveins: %w2, %x0, %x1<br>
+  ; CHECK:   [[COPY:%[0-9]+]]:_(p0) = COPY %x0<br>
+  ; CHECK:   [[COPY1:%[0-9]+]]:_(p0) = COPY %x1<br>
+  ; CHECK:   [[COPY2:%[0-9]+]]:_(s32) = COPY %w2<br>
+  ; CHECK:   [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[COPY2]](s32)<br>
+  ; CHECK:   G_BRCOND [[TRUNC]](s1), %bb.1<br>
+  ; CHECK:   G_BR %bb.2<br>
+  ; CHECK: bb.1:<br>
+  ; CHECK:   successors: %bb.2(0x80000000)<br>
+  ; CHECK: bb.2:<br>
+  ; CHECK:   [[PHI:%[0-9]+]]:_(p0) = G_PHI [[COPY]](p0), %bb.0, [[COPY1]](p0), %bb.1<br>
+  ; CHECK:   %x0 = COPY [[PHI]](p0)<br>
+  ; CHECK:   RET_ReallyLR implicit %x0<br>
   bb.1:<br>
-   ; CHECK-LABEL: name: legalize_phi_ptr<br>
-   ; CHECK-LABEL: bb.0:<br>
-   ; CHECK: [[A:%[0-9]+]]:_(p0) = COPY %x0<br>
-   ; CHECK: [[B:%[0-9]+]]:_(p0) = COPY %x1<br>
-   ; CHECK: [[CE:%[0-9]+]]:_(s32) = COPY %w2<br>
-   ; CHECK: [[C:%[0-9]+]]:_(s1) = G_TRUNC [[CE]]<br>
-<br>
-   ; CHECK-LABEL: bb.1:<br>
-   ; CHECK-LABEL: bb.2:<br>
-   ; CHECK: %3:_(p0) = G_PHI [[A]](p0), %bb.0, [[B]](p0), %bb.1<br>
-   ; CHECK: %x0 = COPY %3(p0)<br>
+<br>
     successors: %bb.2, %bb.3<br>
     liveins: %w2, %x0, %x1<br>
<br>
@@ -178,23 +203,41 @@ registers:<br>
   - { id: 10, class: _, preferred-register: '' }<br>
 liveins:<br>
 body:             |<br>
+  ; CHECK-LABEL: name: legalize_phi_empty<br>
+  ; CHECK: bb.0:<br>
+  ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)<br>
+  ; CHECK:   liveins: %w0<br>
+  ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY %w0<br>
+  ; CHECK:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
+  ; CHECK:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 3<br>
+  ; CHECK:   [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+  ; CHECK:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[COPY]](s32), [[C]]<br>
+  ; CHECK:   [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP]](s32)<br>
+  ; CHECK:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C1]]<br>
+  ; CHECK:   G_BRCOND [[TRUNC]](s1), %bb.1<br>
+  ; CHECK:   G_BR %bb.2<br>
+  ; CHECK: bb.1:<br>
+  ; CHECK:   successors: %bb.3(0x80000000)<br>
+  ; CHECK:   [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C2]]<br>
+  ; CHECK:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ADD1]](s32)<br>
+  ; CHECK:   G_BR %bb.3<br>
+  ; CHECK: bb.2:<br>
+  ; CHECK:   successors: %bb.3(0x80000000)<br>
+  ; CHECK:   [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[ADD]](s32)<br>
+  ; CHECK: bb.3:<br>
+  ; CHECK:   [[PHI:%[0-9]+]]:_(s16) = G_PHI [[TRUNC1]](s16), %bb.1, [[TRUNC2]](s16), %bb.2<br>
+  ; CHECK:   [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+  ; CHECK:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI]](s16)<br>
+  ; CHECK:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ANYEXT]], [[C3]]<br>
+  ; CHECK:   %w0 = COPY [[AND]](s32)<br>
+  ; CHECK:   RET_ReallyLR implicit %w0<br>
   bb.0:<br>
     successors: %bb.1(0x40000000), %bb.2(0x40000000)<br>
     liveins: %w0<br>
    ; Test that we properly legalize a phi with a predecessor that's empty<br>
-   ; CHECK-LABEL: name: legalize_phi_empty<br>
-   ; CHECK-LABEL: bb.0:<br>
-   ; CHECK: [[ENTRY_ADD:%.*]]:_(s32) = G_ADD<br>
-<br>
-   ; CHECK-LABEL: bb.1:<br>
-   ; CHECK: [[ADD_BB1:%.*]]:_(s32) = G_ADD<br>
-   ; CHECK: [[RES_BB1:%.*]]:_(s16) = G_TRUNC [[ADD_BB1]]<br>
<br>
-   ; CHECK-LABEL: bb.2:<br>
-   ; CHECK: [[RES_BB2:%.*]]:_(s16) = G_TRUNC [[ENTRY_ADD]]<br>
<br>
-   ; CHECK: [[RES_PHI:%.*]]:_(s16) = G_PHI [[RES_BB1]](s16), %bb.1, [[RES_BB2]](s16), %bb.2<br>
-   ; CHECK: [[RES:%.*]]:_(s1) = G_TRUNC [[RES_PHI]]<br>
+<br>
<br>
     %0(s32) = COPY %w0<br>
     %1(s32) = G_CONSTANT i32 0<br>
@@ -243,19 +286,39 @@ registers:<br>
   - { id: 7, class: _, preferred-register: '' }<br>
 liveins:<br>
 body:             |<br>
+  ; CHECK-LABEL: name: legalize_phi_loop<br>
+  ; CHECK: bb.0:<br>
+  ; CHECK:   successors: %bb.1(0x80000000)<br>
+  ; CHECK:   liveins: %w0<br>
+  ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY %w0<br>
+  ; CHECK:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+  ; CHECK:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
+  ; CHECK:   [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[C1]](s32)<br>
+  ; CHECK: bb.1:<br>
+  ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)<br>
+  ; CHECK:   [[PHI:%[0-9]+]]:_(s16) = G_PHI [[TRUNC]](s16), %bb.0, %14(s16), %bb.1<br>
+  ; CHECK:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI]](s16)<br>
+  ; CHECK:   [[COPY1:%[0-9]+]]:_(s32) = COPY [[C]](s32)<br>
+  ; CHECK:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[ANYEXT]], [[COPY1]]<br>
+  ; CHECK:   [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[ADD]](s32)<br>
+  ; CHECK:   [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 255<br>
+  ; CHECK:   [[COPY2:%[0-9]+]]:_(s32) = COPY [[ADD]](s32)<br>
+  ; CHECK:   [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY2]], [[C2]]<br>
+  ; CHECK:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[AND]](s32), [[COPY]]<br>
+  ; CHECK:   [[TRUNC2:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP]](s32)<br>
+  ; CHECK:   [[TRUNC3:%[0-9]+]]:_(s16) = G_TRUNC [[ADD]](s32)<br>
+  ; CHECK:   G_BRCOND [[TRUNC2]](s1), %bb.1<br>
+  ; CHECK: bb.2:<br>
+  ; CHECK:   [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 255<br>
+  ; CHECK:   [[COPY3:%[0-9]+]]:_(s32) = COPY [[ADD]](s32)<br>
+  ; CHECK:   [[AND1:%[0-9]+]]:_(s32) = G_AND [[COPY3]], [[C3]]<br>
+  ; CHECK:   %w0 = COPY [[AND1]](s32)<br>
+  ; CHECK:   RET_ReallyLR implicit %w0<br>
   bb.0:<br>
     successors: %bb.1(0x80000000)<br>
     liveins: %w0<br>
    ; Test that we properly legalize a phi that uses a value from the same BB<br>
-   ; CHECK-LABEL: name: legalize_phi_loop<br>
-   ; CHECK-LABEL: bb.0:<br>
-   ; CHECK: [[C0:%.*]]:_(s32) = G_CONSTANT i32 0<br>
-   ; CHECK: [[RES_BB1:%.*]]:_(s16) = G_TRUNC [[C0]]<br>
-<br>
-   ; CHECK-LABEL: bb.1:<br>
-   ; CHECK: [[RES_PHI:%.*]]:_(s16) = G_PHI [[RES_BB1]](s16), %bb.0, [[RES_BB2:%.*]](s16), %bb.1<br>
-   ; CHECK-NEXT: G_ANYEXT [[RES_PHI]]<br>
-   ; CHECK: [[RES_BB2]]:_(s16) = G_ANYEXT<br>
+<br>
     %0(s32) = COPY %w0<br>
     %2(s8) = G_CONSTANT i8 1<br>
     %7(s8) = G_CONSTANT i8 0<br>
@@ -291,19 +354,32 @@ registers:<br>
   - { id: 4, class: _, preferred-register: '' }<br>
 liveins:<br>
 body:             |<br>
+  ; CHECK-LABEL: name: legalize_phi_cycle<br>
+  ; CHECK: bb.0:<br>
+  ; CHECK:   successors: %bb.1(0x80000000)<br>
+  ; CHECK:   liveins: %w0<br>
+  ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY %w0<br>
+  ; CHECK:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
+  ; CHECK:   [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[C]](s32)<br>
+  ; CHECK: bb.1:<br>
+  ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)<br>
+  ; CHECK:   [[PHI:%[0-9]+]]:_(s16) = G_PHI [[TRUNC]](s16), %bb.0, %8(s16), %bb.1<br>
+  ; CHECK:   [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[PHI]](s16)<br>
+  ; CHECK:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 255<br>
+  ; CHECK:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI]](s16)<br>
+  ; CHECK:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ANYEXT]], [[C1]]<br>
+  ; CHECK:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[AND]](s32), [[COPY]]<br>
+  ; CHECK:   [[TRUNC2:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP]](s32)<br>
+  ; CHECK:   [[COPY1:%[0-9]+]]:_(s16) = COPY [[PHI]](s16)<br>
+  ; CHECK:   G_BRCOND [[TRUNC2]](s1), %bb.1<br>
+  ; CHECK: bb.2:<br>
+  ; CHECK:   %w0 = COPY [[AND]](s32)<br>
+  ; CHECK:   RET_ReallyLR implicit %w0<br>
   bb.0:<br>
     successors: %bb.1(0x80000000)<br>
     liveins: %w0<br>
    ; Test that we properly legalize a phi that uses itself<br>
-   ; CHECK-LABEL: name: legalize_phi_cycle<br>
-   ; CHECK-LABEL: bb.0:<br>
-   ; CHECK: [[C0:%.*]]:_(s32) = G_CONSTANT i32 0<br>
-   ; CHECK: [[RES_BB1:%.*]]:_(s16) = G_TRUNC [[C0]]<br>
-<br>
-   ; CHECK-LABEL: bb.1:<br>
-   ; CHECK: [[RES_PHI:%.*]]:_(s16) = G_PHI [[RES_BB1]](s16), %bb.0, [[RES_BB2:%.*]](s16), %bb.1<br>
-   ; CHECK-NEXT: G_TRUNC<br>
-   ; CHECK: [[RES_BB2]]:_(s16) = COPY<br>
+<br>
<br>
     %0(s32) = COPY %w0<br>
     %4(s8) = G_CONSTANT i8 0<br>
@@ -347,30 +423,50 @@ registers:<br>
   - { id: 14, class: _, preferred-register: '' }<br>
 liveins:<br>
 body:             |<br>
+  ; CHECK-LABEL: name: legalize_phi_same_bb<br>
+  ; CHECK: bb.0:<br>
+  ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)<br>
+  ; CHECK:   liveins: %w0<br>
+  ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY %w0<br>
+  ; CHECK:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
+  ; CHECK:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 3<br>
+  ; CHECK:   [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+  ; CHECK:   [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 42<br>
+  ; CHECK:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[COPY]](s32), [[C]]<br>
+  ; CHECK:   [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP]](s32)<br>
+  ; CHECK:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C1]]<br>
+  ; CHECK:   G_BRCOND [[TRUNC]](s1), %bb.1<br>
+  ; CHECK:   G_BR %bb.2<br>
+  ; CHECK: bb.1:<br>
+  ; CHECK:   successors: %bb.3(0x80000000)<br>
+  ; CHECK:   [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C2]]<br>
+  ; CHECK:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ADD1]](s32)<br>
+  ; CHECK:   [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[ADD1]](s32)<br>
+  ; CHECK:   G_BR %bb.3<br>
+  ; CHECK: bb.2:<br>
+  ; CHECK:   successors: %bb.3(0x80000000)<br>
+  ; CHECK:   [[TRUNC3:%[0-9]+]]:_(s16) = G_TRUNC [[C3]](s32)<br>
+  ; CHECK:   [[TRUNC4:%[0-9]+]]:_(s16) = G_TRUNC [[ADD]](s32)<br>
+  ; CHECK: bb.3:<br>
+  ; CHECK:   [[PHI:%[0-9]+]]:_(s16) = G_PHI [[TRUNC2]](s16), %bb.1, [[TRUNC4]](s16), %bb.2<br>
+  ; CHECK:   [[PHI1:%[0-9]+]]:_(s16) = G_PHI [[TRUNC1]](s16), %bb.1, [[TRUNC3]](s16), %bb.2<br>
+  ; CHECK:   [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 255<br>
+  ; CHECK:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI]](s16)<br>
+  ; CHECK:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ANYEXT]], [[C4]]<br>
+  ; CHECK:   [[C5:%[0-9]+]]:_(s32) = G_CONSTANT i32 255<br>
+  ; CHECK:   [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI1]](s16)<br>
+  ; CHECK:   [[AND1:%[0-9]+]]:_(s32) = G_AND [[ANYEXT1]], [[C5]]<br>
+  ; CHECK:   [[ADD2:%[0-9]+]]:_(s32) = G_ADD [[C]]1, [[C]]2<br>
+  ; CHECK:   %w0 = COPY [[C]]3(s32)<br>
+  ; CHECK:   RET_ReallyLR implicit %w0<br>
   bb.0:<br>
     successors: %bb.1(0x40000000), %bb.2(0x40000000)<br>
     liveins: %w0<br>
    ; Make sure that we correctly insert the new legalized G_PHI at the<br>
    ; correct location (ie make sure G_PHIs are the first insts in the BB).<br>
-   ; CHECK-LABEL: name: legalize_phi_same_bb<br>
-   ; CHECK-LABEL: bb.0:<br>
-   ; CHECK: [[C42:%.*]]:_(s32) = G_CONSTANT i32 42<br>
-   ; CHECK: [[ENTRY_ADD:%.*]]:_(s32) = G_ADD<br>
-<br>
-   ; CHECK-LABEL: bb.1:<br>
-   ; CHECK: [[BB1_ADD:%.*]]:_(s32) = G_ADD<br>
-   ; CHECK: [[RES1_BB1:%.*]]:_(s16) = G_TRUNC [[BB1_ADD]]<br>
-   ; CHECK: [[RES2_BB1:%.*]]:_(s16) = G_TRUNC [[BB1_ADD]]<br>
-<br>
-   ; CHECK-LABEL: bb.2:<br>
-   ; CHECK: [[RES1_BB2:%.*]]:_(s16) = G_TRUNC [[ENTRY_ADD]]<br>
-   ; CHECK: [[RES2_BB2:%.*]]:_(s16) = G_TRUNC [[C42]]<br>
-<br>
-   ; CHECK-LABEL: bb.3:<br>
-   ; CHECK: [[RES1_PHI:%.*]]:_(s16) = G_PHI [[RES1_BB1]](s16), %bb.1, [[RES1_BB2]](s16), %bb.2<br>
-   ; CHECK-NEXT: [[RES_PHI:%.*]]:_(s16) = G_PHI [[RES2_BB1]](s16), %bb.1, [[RES2_BB2]](s16), %bb.2<br>
-   ; CHECK-NEXT: G_TRUNC<br>
-   ; CHECK-NEXT: G_TRUNC<br>
+<br>
+<br>
+<br>
<br>
     %0(s32) = COPY %w0<br>
     %1(s32) = G_CONSTANT i32 0<br>
@@ -431,27 +527,51 @@ registers:<br>
   - { id: 15, class: _, preferred-register: '' }<br>
 liveins:<br>
 body:             |<br>
+  ; CHECK-LABEL: name: legalize_phi_diff_bb<br>
+  ; CHECK: bb.0:<br>
+  ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)<br>
+  ; CHECK:   liveins: %w0, %w1<br>
+  ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY %w0<br>
+  ; CHECK:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
+  ; CHECK:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 3<br>
+  ; CHECK:   [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+  ; CHECK:   [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 44<br>
+  ; CHECK:   [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 43<br>
+  ; CHECK:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[COPY]](s32), [[C]]<br>
+  ; CHECK:   [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP]](s32)<br>
+  ; CHECK:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[C1]]<br>
+  ; CHECK:   [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[ADD]](s32)<br>
+  ; CHECK:   [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[ADD]](s32)<br>
+  ; CHECK:   G_BRCOND [[TRUNC]](s1), %bb.1<br>
+  ; CHECK:   G_BR %bb.2<br>
+  ; CHECK: bb.1:<br>
+  ; CHECK:   successors: %bb.2(0x40000000), %bb.1(0x40000000)<br>
+  ; CHECK:   [[PHI:%[0-9]+]]:_(s16) = G_PHI [[TRUNC2]](s16), %bb.0, [[C]]2(s16), %bb.1<br>
+  ; CHECK:   [[TRUNC3:%[0-9]+]]:_(s8) = G_TRUNC [[PHI]](s16)<br>
+  ; CHECK:   [[C5:%[0-9]+]]:_(s32) = G_CONSTANT i32 255<br>
+  ; CHECK:   [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI]](s16)<br>
+  ; CHECK:   [[AND:%[0-9]+]]:_(s32) = G_AND [[ANYEXT]], [[C5]]<br>
+  ; CHECK:   [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[AND]], [[C2]]<br>
+  ; CHECK:   [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[ADD1]](s32), [[C3]]<br>
+  ; CHECK:   [[TRUNC4:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP1]](s32)<br>
+  ; CHECK:   [[COPY1:%[0-9]+]]:_(s16) = COPY [[PHI]](s16)<br>
+  ; CHECK:   [[TRUNC5:%[0-9]+]]:_(s16) = G_TRUNC [[C4]](s32)<br>
+  ; CHECK:   G_BRCOND [[TRUNC4]](s1), %bb.2<br>
+  ; CHECK:   G_BR %bb.1<br>
+  ; CHECK: bb.2:<br>
+  ; CHECK:   [[PHI1:%[0-9]+]]:_(s16) = G_PHI [[COPY1]](s16), %bb.1, [[TRUNC1]](s16), %bb.0<br>
+  ; CHECK:   [[C6:%[0-9]+]]:_(s32) = G_CONSTANT i32 255<br>
+  ; CHECK:   [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[PHI1]](s16)<br>
+  ; CHECK:   [[AND1:%[0-9]+]]:_(s32) = G_AND [[C]]8, [[C]]7<br>
+  ; CHECK:   %w0 = COPY [[AND1]](s32)<br>
+  ; CHECK:   RET_ReallyLR implicit %w0<br>
   bb.0:<br>
     successors: %bb.1(0x40000000), %bb.3(0x40000000)<br>
     liveins: %w0, %w1<br>
    ; Make sure that we correctly legalize PHIs sharing common defs<br>
    ; in different BBs.<br>
-   ; CHECK-LABEL: name: legalize_phi_diff_bb<br>
-   ; CHECK-LABEL: bb.0:<br>
-   ; CHECK: [[C44:%.*]]:_(s32) = G_CONSTANT i32 44<br>
-   ; CHECK: [[C43:%.*]]:_(s32) = G_CONSTANT i32 43<br>
-   ; CHECK: [[ENTRY_ADD:%.*]]:_(s32) = G_ADD<br>
-   ; CHECK: [[RES_ENTRY:%.*]]:_(s16) = G_TRUNC [[ENTRY_ADD]]<br>
-   ; CHECK: [[RES_ENTRY1:%.*]]:_(s16) = G_TRUNC [[ENTRY_ADD]]<br>
-<br>
-   ; CHECK-LABEL: bb.1:<br>
-   ; CHECK: [[RES1_PHI:%.*]]:_(s16) = G_PHI [[RES_ENTRY]](s16), %bb.0, [[RES_BB1:%.*]](s16), %bb.1<br>
-   ; CHECK: [[RES_BB1:%.*]]:_(s16) = G_TRUNC<br>
-   ; CHECK: [[RES_FOR_BB2:%.*]]:_(s16) = COPY [[RES1_PHI]]<br>
-<br>
-   ; CHECK-LABEL: bb.2:<br>
-   ; CHECK: [[RES2_PHI:%.*]]:_(s16) = G_PHI [[RES_FOR_BB2]](s16), %bb.1, [[RES_ENTRY1:%.*]](s16), %bb.0<br>
-   ; CHECK-NEXT: G_TRUNC<br>
+<br>
+<br>
<br>
     %0(s32) = COPY %w0<br>
     %1(s32) = COPY %w1<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>pow.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-pow.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-pow.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>pow.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>pow.mir Tue Nov 14 14:42:19 2017<br>
@@ -28,11 +28,13 @@ body: |<br>
     ; CHECK: BL $pow, csr_aarch64_aapcs, implicit-def %lr, implicit %sp, implicit %d0, implicit %d1, implicit-def %d0<br>
     ; CHECK: %4:_(s64) = COPY %d0<br>
     %4:_(s64) = G_FPOW %0, %1<br>
+    %x0 = COPY %4<br>
<br>
     ; CHECK: %s0 = COPY %2<br>
     ; CHECK: %s1 = COPY %3<br>
     ; CHECK: BL $powf, csr_aarch64_aapcs, implicit-def %lr, implicit %sp, implicit %s0, implicit %s1, implicit-def %s0<br>
     ; CHECK: %5:_(s32) = COPY %s0<br>
     %5:_(s32) = G_FPOW %2, %3<br>
+    %w0 = COPY %5<br>
<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>rem.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-rem.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-rem.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>rem.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>rem.mir Tue Nov 14 14:42:19 2017<br>
@@ -1,3 +1,4 @@<br>
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
 # RUN: llc -O0 -run-pass=legalizer -global-isel %s -o - | FileCheck %s<br>
<br>
 --- |<br>
@@ -32,12 +33,16 @@ body: |<br>
     liveins: %x0, %x1, %x2, %x3<br>
<br>
     ; CHECK-LABEL: name: test_urem_64<br>
-    ; CHECK: [[QUOT:%[0-9]+]]:_(s64) = G_UDIV %0, %1<br>
-    ; CHECK: [[PROD:%[0-9]+]]:_(s64) = G_MUL [[QUOT]], %1<br>
-    ; CHECK: [[RES:%[0-9]+]]:_(s64) = G_SUB %0, [[PROD]]<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY %x1<br>
+    ; CHECK: [[UDIV:%[0-9]+]]:_(s64) = G_UDIV [[COPY]], [[COPY1]]<br>
+    ; CHECK: [[MUL:%[0-9]+]]:_(s64) = G_MUL [[UDIV]], [[COPY1]]<br>
+    ; CHECK: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[COPY]], [[MUL]]<br>
+    ; CHECK: %x0 = COPY [[SUB]](s64)<br>
     %0(s64) = COPY %x0<br>
     %1(s64) = COPY %x1<br>
     %2(s64) = G_UREM %0, %1<br>
+    %x0 = COPY %2<br>
<br>
<br>
 ...<br>
@@ -52,18 +57,22 @@ registers:<br>
 body: |<br>
   bb.0.entry:<br>
     liveins: %x0, %x1, %x2, %x3<br>
-    ; CHECK-LABEL: name: test_srem_32<br>
-    ; CHECK: [[T1:%.*]]:_(s32) = G_TRUNC %0(s64)<br>
-    ; CHECK: [[T2:%.*]]:_(s32) = G_TRUNC %1(s64)<br>
-    ; CHECK: [[DIV:%.*]]:_(s32) = G_SDIV [[T1]], [[T2]]<br>
-    ; CHECK: [[MUL:%.*]]:_(s32) = G_MUL [[DIV]], [[T2]]<br>
-    ; CHECK: [[RES:%.*]]:_(s32) = G_SUB [[T1]], [[MUL]]<br>
<br>
+    ; CHECK-LABEL: name: test_srem_32<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY %x1<br>
+    ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)<br>
+    ; CHECK: [[SDIV:%[0-9]+]]:_(s32) = G_SDIV [[TRUNC]], [[TRUNC1]]<br>
+    ; CHECK: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[SDIV]], [[TRUNC1]]<br>
+    ; CHECK: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[TRUNC]], [[MUL]]<br>
+    ; CHECK: %w0 = COPY [[SUB]](s32)<br>
     %0(s64) = COPY %x0<br>
     %1(s64) = COPY %x1<br>
     %3(s32) = G_TRUNC %0<br>
     %4(s32) = G_TRUNC %1<br>
     %5(s32) = G_SREM %3, %4<br>
+    %w0 = COPY %5<br>
<br>
 ...<br>
 ---<br>
@@ -77,30 +86,35 @@ registers:<br>
 body: |<br>
   bb.0.entry:<br>
     liveins: %x0, %x1, %x2, %x3<br>
-    ; CHECK-LABEL: name: test_srem_8<br>
<br>
-    ; CHECK: [[C1:%.*]]:_(s32) = G_CONSTANT i32 24<br>
-    ; CHECK: [[SRC1:%.*]]:_(s32) = G_TRUNC %0(s64)<br>
-    ; CHECK: [[SHL1:%.*]]:_(s32) = G_SHL [[SRC1]], [[C1]]<br>
-    ; CHECK: [[LHS_SEXT:%.*]]:_(s32) = G_ASHR [[SHL1]], [[C1]]<br>
-    ; CHECK: [[C2:%.*]]:_(s32) = G_CONSTANT i32 24<br>
-    ; CHECK: [[SRC2:%.*]]:_(s32) = G_TRUNC %1(s64)<br>
-    ; CHECK: [[SHL2:%.*]]:_(s32) = G_SHL [[SRC2]], [[C2]]<br>
-    ; CHECK: [[RHS_SEXT:%.*]]:_(s32) = G_ASHR [[SHL2]], [[C2]]<br>
-    ; CHECK: [[SDIV:%.*]]:_(s32) = G_SDIV [[LHS_SEXT]], [[RHS_SEXT]]<br>
-    ; CHECK: [[A:%.*]]:_(s32) = COPY [[SDIV]]<br>
-    ; CHECK: [[SRC3:%.*]]:_(s32) = G_TRUNC %1(s64)<br>
-    ; CHECK: [[MUL:%.*]]:_(s32) = G_MUL [[A]], [[SRC3]]<br>
-    ; CHECK: [[SRC4:%.*]]:_(s32) = G_TRUNC %0(s64)<br>
-    ; CHECK: [[SRC5:%.*]]:_(s32) = COPY [[MUL]]<br>
-    ; CHECK: [[SUB:%.*]]:_(s32) = G_SUB [[SRC4]], [[SRC5]]<br>
-    ; CHECK: [[RES:%.*]]:_(s8) = G_TRUNC [[SUB]]<br>
<br>
+    ; CHECK-LABEL: name: test_srem_8<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY %x1<br>
+    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24<br>
+    ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[TRUNC]], [[C]]<br>
+    ; CHECK: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]]<br>
+    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24<br>
+    ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)<br>
+    ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[TRUNC1]], [[C1]]<br>
+    ; CHECK: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[SHL1]], [[C1]]<br>
+    ; CHECK: [[SDIV:%[0-9]+]]:_(s32) = G_SDIV [[ASHR]], [[ASHR1]]<br>
+    ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[SDIV]](s32)<br>
+    ; CHECK: [[TRUNC2:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)<br>
+    ; CHECK: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY2]], [[TRUNC2]]<br>
+    ; CHECK: [[TRUNC3:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: [[COPY3:%[0-9]+]]:_(s32) = COPY [[MUL]](s32)<br>
+    ; CHECK: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[TRUNC3]], [[COPY3]]<br>
+    ; CHECK: [[COPY4:%[0-9]+]]:_(s32) = COPY [[SUB]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY4]](s32)<br>
     %0(s64) = COPY %x0<br>
     %1(s64) = COPY %x1<br>
     %6(s8) = G_TRUNC %0<br>
     %7(s8) = G_TRUNC %1<br>
     %8(s8) = G_SREM %6, %7<br>
+    %9:_(s32) = G_ANYEXT %8<br>
+    %w0 = COPY %9<br>
 ...<br>
 ---<br>
 name:            test_frem<br>
@@ -114,20 +128,32 @@ registers:<br>
 body: |<br>
   bb.0.entry:<br>
     liveins: %x0, %x1, %x2, %x3<br>
-    ; CHECK-LABEL: name: test_frem<br>
<br>
-    ; CHECK: %d0 = COPY %0<br>
-    ; CHECK: %d1 = COPY %1<br>
+    ; CHECK-LABEL: name: test_frem<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY %x1<br>
+    ; CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def %sp, implicit %sp<br>
+    ; CHECK: %d0 = COPY [[COPY]](s64)<br>
+    ; CHECK: %d1 = COPY [[COPY1]](s64)<br>
     ; CHECK: BL $fmod, csr_aarch64_aapcs, implicit-def %lr, implicit %sp, implicit %d0, implicit %d1, implicit-def %d0<br>
-    ; CHECK: [[RES:%.*]]:_(s64) = COPY %d0<br>
+    ; CHECK: [[COPY2:%[0-9]+]]:_(s64) = COPY %d0<br>
+    ; CHECK: ADJCALLSTACKUP 0, 0, implicit-def %sp, implicit %sp<br>
+    ; CHECK: %x0 = COPY [[COPY2]](s64)<br>
+    ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)<br>
+    ; CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def %sp, implicit %sp<br>
+    ; CHECK: %s0 = COPY [[TRUNC]](s32)<br>
+    ; CHECK: %s1 = COPY [[TRUNC1]](s32)<br>
+    ; CHECK: BL $fmodf, csr_aarch64_aapcs, implicit-def %lr, implicit %sp, implicit %s0, implicit %s1, implicit-def %s0<br>
+    ; CHECK: [[COPY3:%[0-9]+]]:_(s32) = COPY %s0<br>
+    ; CHECK: ADJCALLSTACKUP 0, 0, implicit-def %sp, implicit %sp<br>
+    ; CHECK: %w0 = COPY [[COPY3]](s32)<br>
     %0(s64) = COPY %x0<br>
     %1(s64) = COPY %x1<br>
     %2(s64) = G_FREM %0, %1<br>
+    %x0 = COPY %2<br>
<br>
-    ; CHECK: %s0 = COPY %3<br>
-    ; CHECK: %s1 = COPY %4<br>
-    ; CHECK: BL $fmodf, csr_aarch64_aapcs, implicit-def %lr, implicit %sp, implicit %s0, implicit %s1, implicit-def %s0<br>
-    ; CHECK: [[RES:%.*]]:_(s32) = COPY %s0<br>
     %3(s32) = G_TRUNC %0<br>
     %4(s32) = G_TRUNC %1<br>
     %5(s32) = G_FREM %3, %4<br>
+    %w0 = COPY %5<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>shift.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-shift.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-shift.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>shift.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>shift.mir Tue Nov 14 14:42:19 2017<br>
@@ -1,3 +1,4 @@<br>
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
 # RUN: llc -O0 -run-pass=legalizer -global-isel %s -o - | FileCheck %s<br>
<br>
 --- |<br>
@@ -22,37 +23,49 @@ registers:<br>
 body: |<br>
   bb.0.entry:<br>
     liveins: %x0, %x1, %x2, %x3<br>
+    ; CHECK-LABEL: name: test_shift<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY %x1<br>
+    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24<br>
+    ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[TRUNC]], [[C]]<br>
+    ; CHECK: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]]<br>
+    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24<br>
+    ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)<br>
+    ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[TRUNC1]], [[C1]]<br>
+    ; CHECK: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[SHL1]], [[C1]]<br>
+    ; CHECK: [[ASHR2:%[0-9]+]]:_(s32) = G_ASHR [[ASHR]], [[ASHR1]]<br>
+    ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[ASHR2]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY2]](s32)<br>
+    ; CHECK: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 255<br>
+    ; CHECK: [[TRUNC2:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: [[AND:%[0-9]+]]:_(s32) = G_AND [[TRUNC2]], [[C2]]<br>
+    ; CHECK: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 255<br>
+    ; CHECK: [[TRUNC3:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)<br>
+    ; CHECK: [[AND1:%[0-9]+]]:_(s32) = G_AND [[TRUNC3]], [[C3]]<br>
+    ; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[AND]], [[AND1]]<br>
+    ; CHECK: [[COPY3:%[0-9]+]]:_(s32) = COPY [[LSHR]](s32)<br>
+    ; CHECK: %w0 = COPY [[COPY3]](s32)<br>
+    ; CHECK: [[TRUNC4:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+    ; CHECK: [[TRUNC5:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)<br>
+    ; CHECK: [[SHL2:%[0-9]+]]:_(s32) = G_SHL [[COPY1]]0, [[COPY1]]1<br>
+    ; CHECK: [[COPY4:%[0-9]+]]:_(s32) = COPY [[COPY1]]2(s32)<br>
+    ; CHECK: %w0 = COPY [[COPY4]](s32)<br>
     %0(s64) = COPY %x0<br>
     %1(s64) = COPY %x1<br>
     %2(s8) = G_TRUNC %0<br>
     %3(s8) = G_TRUNC %1<br>
<br>
-    ; CHECK: [[C1:%.*]]:_(s32) = G_CONSTANT i32 24<br>
-    ; CHECK: [[SRC:%.*]]:_(s32) = G_TRUNC %0(s64)<br>
-    ; CHECK: [[SHL1:%.*]]:_(s32) = G_SHL [[SRC]], [[C1]]<br>
-    ; CHECK: [[SEXT1:%.*]]:_(s32) = G_ASHR [[SHL1]], [[C1]]<br>
-    ; CHECK: [[C2:%.*]]:_(s32) = G_CONSTANT i32 24<br>
-    ; CHECK: [[SRC2:%.*]]:_(s32) = G_TRUNC %1(s64)<br>
-    ; CHECK: [[SHL2:%.*]]:_(s32) = G_SHL [[SRC2]], [[C2]]<br>
-    ; CHECK: [[SEXT2:%.*]]:_(s32) = G_ASHR [[SHL2]], [[C2]]<br>
-    ; CHECK: [[RES32:%[0-9]+]]:_(s32) = G_ASHR [[SEXT1]], [[SEXT2]]<br>
-    ; CHECK: %4:_(s8) = G_TRUNC [[RES32]]<br>
     %4(s8) = G_ASHR %2, %3<br>
+    %7:_(s32) = G_ANYEXT %4<br>
+    %w0 = COPY %7<br>
<br>
<br>
-    ; CHECK: [[C1:%.*]]:_(s32) = G_CONSTANT i32 255<br>
-    ; CHECK: [[SRC:%.*]]:_(s32) = G_TRUNC %0(s64)<br>
-    ; CHECK: [[ZEXT:%.*]]:_(s32) = G_AND [[SRC]], [[C1]]<br>
-    ; CHECK: [[C2:%.*]]:_(s32) = G_CONSTANT i32 255<br>
-    ; CHECK: [[SRC2:%.*]]:_(s32) = G_TRUNC %1(s64)<br>
-    ; CHECK: [[ZEXT2:%.*]]:_(s32) = G_AND [[SRC2]], [[C2]]<br>
-    ; CHECK: [[RES32:%[0-9]+]]:_(s32) = G_LSHR [[ZEXT]], [[ZEXT2]]<br>
-    ; CHECK: %5:_(s8) = G_TRUNC [[RES32]]<br>
     %5(s8) = G_LSHR %2, %3<br>
+    %8:_(s32) = G_ANYEXT %5<br>
+    %w0 = COPY %8<br>
<br>
-    ; CHECK: [[OP0:%.*]]:_(s32) = G_TRUNC %0<br>
-    ; CHECK: [[OP1:%.*]]:_(s32) = G_TRUNC %1<br>
-    ; CHECK: [[RES32:%.*]]:_(s32) = G_SHL [[OP0]], [[OP1]]<br>
-    ; CHECK: [[RES:%.*]]:_(s8) = G_TRUNC [[RES32]](s32)<br>
     %6(s8) = G_SHL %2, %3<br>
+    %9:_(s32) = G_ANYEXT %6<br>
+    %w0 = COPY %9<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>simple.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-simple.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-simple.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>simple.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>simple.mir Tue Nov 14 14:42:19 2017<br>
@@ -1,3 +1,4 @@<br>
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
 # RUN: llc -O0 -run-pass=legalizer -global-isel %s -o - | FileCheck %s<br>
<br>
 --- |<br>
@@ -12,6 +13,9 @@<br>
   define void @bitcast128() {<br>
     ret void<br>
   }<br>
+  define void @testExtOfCopyOfTrunc() {<br>
+    ret void<br>
+  }<br>
 ...<br>
<br>
 ---<br>
@@ -35,6 +39,46 @@ registers:<br>
   - { id: 15, class: _ }<br>
   - { id: 16, class: _ }<br>
 body: |<br>
+  ; CHECK-LABEL: name: test_simple<br>
+  ; CHECK: bb.0.entry:<br>
+  ; CHECK:   successors: %bb.1.next(0x80000000)<br>
+  ; CHECK:   [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
+  ; CHECK:   [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[COPY]](s64)<br>
+  ; CHECK:   [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+  ; CHECK:   [[INTTOPTR:%[0-9]+]]:_(p0) = G_INTTOPTR [[COPY]](s64)<br>
+  ; CHECK:   [[PTRTOINT:%[0-9]+]]:_(s64) = G_PTRTOINT [[INTTOPTR]](p0)<br>
+  ; CHECK:   %x0 = COPY [[PTRTOINT]](s64)<br>
+  ; CHECK:   G_BRCOND [[TRUNC]](s1), %bb.1.next<br>
+  ; CHECK: bb.1.next:<br>
+  ; CHECK:   [[TRUNC2:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+  ; CHECK:   [[TRUNC3:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+  ; CHECK:   [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[TRUNC]](s1), [[TRUNC2]], [[TRUNC3]]<br>
+  ; CHECK:   [[COPY1:%[0-9]+]]:_(s32) = COPY [[SELECT]](s32)<br>
+  ; CHECK:   %w0 = COPY [[COPY1]](s32)<br>
+  ; CHECK:   [[TRUNC4:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+  ; CHECK:   [[TRUNC5:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+  ; CHECK:   [[SELECT1:%[0-9]+]]:_(s32) = G_SELECT [[TRUNC]](s1), [[TRUNC4]], [[TRUNC5]]<br>
+  ; CHECK:   [[COPY2:%[0-9]+]]:_(s32) = COPY [[SELECT1]](s32)<br>
+  ; CHECK:   %w0 = COPY [[COPY2]](s32)<br>
+  ; CHECK:   [[TRUNC6:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+  ; CHECK:   [[TRUNC7:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
+  ; CHECK:   [[SELECT2:%[0-9]+]]:_(s32) = G_SELECT [[TRUNC]](s1), [[TRUNC6]], [[TRUNC7]]<br>
+  ; CHECK:   [[COPY3:%[0-9]+]]:_(s32) = COPY [[SELECT2]](s32)<br>
+  ; CHECK:   %w0 = COPY [[COPY3]](s32)<br>
+  ; CHECK:   [[SELECT3:%[0-9]+]]:_(s32) = G_SELECT [[TRUNC]](s1), [[TRUNC1]], [[TRUNC1]]<br>
+  ; CHECK:   [[SELECT4:%[0-9]+]]:_(s64) = G_SELECT [[TRUNC]](s1), [[COPY]], [[COPY]]<br>
+  ; CHECK:   %x0 = COPY [[SELECT4]](s64)<br>
+  ; CHECK:   [[BITCAST:%[0-9]+]]:_(<2 x s32>) = G_BITCAST [[COPY]](s64)<br>
+  ; CHECK:   [[BITCAST1:%[0-9]+]]:_(s64) = G_BITCAST [[TRUNC]]2(<2 x s32>)<br>
+  ; CHECK:   %x0 = COPY [[BITCAST1]](s64)<br>
+  ; CHECK:   [[BITCAST2:%[0-9]+]]:_(s32) = G_BITCAST [[TRUNC]]0(s32)<br>
+  ; CHECK:   %w0 = COPY [[TRUNC]]4(s32)<br>
+  ; CHECK:   [[BITCAST3:%[0-9]+]]:_(<4 x s8>) = G_BITCAST [[COPY]](s64)<br>
+  ; CHECK:   [[BITCAST4:%[0-9]+]]:_(s32) = G_BITCAST [[TRUNC]]5(<4 x s8>)<br>
+  ; CHECK:   %w0 = COPY [[BITCAST4]](s32)<br>
+  ; CHECK:   [[BITCAST5:%[0-9]+]]:_(<2 x s16>) = G_BITCAST [[COPY]](s64)<br>
+  ; CHECK:   [[BITCAST6:%[0-9]+]]:_(s32) = G_BITCAST [[TRUNC]]6(<2 x s16>)<br>
+  ; CHECK:   %w0 = COPY [[BITCAST6]](s32)<br>
   bb.0.entry:<br>
     liveins: %x0, %x1, %x2, %x3<br>
     %0(s64) = COPY %x0<br>
@@ -44,48 +88,41 @@ body: |<br>
     %3(s16) = G_TRUNC %0<br>
     %4(s32) = G_TRUNC %0<br>
<br>
-    ; CHECK-LABEL: name: test_simple<br>
-    ; CHECK: %5:_(p0) = G_INTTOPTR %0<br>
-    ; CHECK: %6:_(s64) = G_PTRTOINT %5<br>
     %5(p0) = G_INTTOPTR %0<br>
     %6(s64) = G_PTRTOINT %5<br>
+    %x0 = COPY %6<br>
<br>
-    ; CHECK: G_BRCOND %1(s1), %bb.1.next<br>
     G_BRCOND %1, %bb.1.next<br>
<br>
   bb.1.next:<br>
<br>
-    ; CHECK: [[LHS:%[0-9]+]]:_(s32) = G_TRUNC %0<br>
-    ; CHECK: [[RHS:%[0-9]+]]:_(s32) = G_TRUNC %0<br>
-    ; CHECK: [[RES:%[0-9]+]]:_(s32) = G_SELECT %1(s1), [[LHS]], [[RHS]]<br>
-    ; CHECK: %7:_(s1) = G_TRUNC [[RES]](s32)<br>
     %7(s1) = G_SELECT %1, %1, %1<br>
+    %21:_(s32) = G_ANYEXT %7<br>
+    %w0 = COPY %21<br>
<br>
-    ; CHECK: [[LHS:%[0-9]+]]:_(s32) = G_TRUNC %0<br>
-    ; CHECK: [[RHS:%[0-9]+]]:_(s32) = G_TRUNC %0<br>
-    ; CHECK: [[RES:%[0-9]+]]:_(s32) = G_SELECT %1(s1), [[LHS]], [[RHS]]<br>
-    ; CHECK: %8:_(s8) = G_TRUNC [[RES]](s32)<br>
     %8(s8) = G_SELECT %1, %2, %2<br>
+    %20:_(s32) = G_ANYEXT %8<br>
+    %w0 = COPY %20<br>
<br>
-    ; CHECK: [[LHS:%[0-9]+]]:_(s32) = G_TRUNC %0<br>
-    ; CHECK: [[RHS:%[0-9]+]]:_(s32) = G_TRUNC %0<br>
-    ; CHECK: [[RES:%[0-9]+]]:_(s32) = G_SELECT %1(s1), [[LHS]], [[RHS]]<br>
-    ; CHECK: %9:_(s16) = G_TRUNC [[RES]](s32)<br>
     %9(s16) = G_SELECT %1, %3, %3<br>
+    %19:_(s32) = G_ANYEXT %9<br>
+    %w0 = COPY %19<br>
<br>
     %10(s32) = G_SELECT %1, %4, %4<br>
     %11(s64) = G_SELECT %1, %0, %0<br>
+    %x0 = COPY %11<br>
<br>
-    ; CHECK: %12:_(<2 x s32>) = G_BITCAST %0<br>
-    ; CHECK: %13:_(s64) = G_BITCAST %12<br>
-    ; CHECK: %14:_(s32) = G_BITCAST %10<br>
-    ; CHECK: %15:_(<4 x s8>) = G_BITCAST %0<br>
-    ; CHECK: %16:_(<2 x s16>) = G_BITCAST %0<br>
     %12(<2 x s32>) = G_BITCAST %0<br>
     %13(s64) = G_BITCAST %12<br>
+    %x0 = COPY %13<br>
     %14(s32) = G_BITCAST %10<br>
+    %w0 = COPY %14<br>
     %15(<4 x s8>) = G_BITCAST %0<br>
+    %17:_(s32) = G_BITCAST %15<br>
+    %w0 = COPY %17<br>
     %16(<2 x s16>) = G_BITCAST %0<br>
+    %18:_(s32) = G_BITCAST %16<br>
+    %w0 = COPY %18<br>
 ...<br>
<br>
 ---<br>
@@ -99,9 +136,15 @@ registers:<br>
 body:             |<br>
   bb.1:<br>
     liveins: %x0, %x1<br>
-    ; CHECK-LABEL: bitcast128<br>
     ; This is legal and shouldn't be changed.<br>
-    ; CHECK: %2:_(<2 x s64>) = G_BITCAST %3(s128)<br>
+    ; CHECK-LABEL: name: bitcast128<br>
+    ; CHECK: liveins: %x0, %x1<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY %x1<br>
+    ; CHECK: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY]](s64), [[COPY1]](s64)<br>
+    ; CHECK: [[BITCAST:%[0-9]+]]:_(<2 x s64>) = G_BITCAST [[MV]](s128)<br>
+    ; CHECK: %q0 = COPY [[BITCAST]](<2 x s64>)<br>
+    ; CHECK: RET_ReallyLR implicit %q0<br>
     %0(s64) = COPY %x0<br>
     %1(s64) = COPY %x1<br>
     %3(s128) = G_MERGE_VALUES %0(s64), %1(s64)<br>
@@ -110,3 +153,29 @@ body:             |<br>
     RET_ReallyLR implicit %q0<br>
<br>
 ...<br>
+---<br>
+name:            testExtOfCopyOfTrunc<br>
+tracksRegLiveness: true<br>
+registers:<br>
+  - { id: 0, class: _}<br>
+  - { id: 1, class: _}<br>
+  - { id: 2, class: _}<br>
+  - { id: 3, class: _}<br>
+body:             |<br>
+  bb.1:<br>
+    liveins: %x0<br>
+    ; CHECK-LABEL: name: testExtOfCopyOfTrunc<br>
+    ; CHECK: liveins: %x0<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %x0<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s1) = COPY %1:_(s1)<br>
+    ; CHECK: [[COPY2:%[0-9]+]]:_(s64) = COPY [[COPY]](s64)<br>
+    ; CHECK: %x0 = COPY [[COPY2]](s64)<br>
+    ; CHECK: RET_ReallyLR implicit %x0<br>
+    %0(s64) = COPY %x0<br>
+    %1(s1) = G_TRUNC %0<br>
+    %2(s1) = COPY %1<br>
+    %3(s64) = G_ANYEXT %2<br>
+    %x0 = COPY %3<br>
+    RET_ReallyLR implicit %x0<br>
+<br>
+...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>sub.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-sub.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-sub.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>sub.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>sub.mir Tue Nov 14 14:42:19 2017<br>
@@ -29,8 +29,7 @@ body: |<br>
     ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
     ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)<br>
     ; CHECK: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[TRUNC]], [[TRUNC1]]<br>
-    ; CHECK: [[TRUNC2:%[0-9]+]]:_(s8) = G_TRUNC [[SUB]](s32)<br>
-    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[TRUNC2]](s8)<br>
+    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[SUB]](s32)<br>
     ; CHECK: %x0 = COPY [[ANYEXT]](s64)<br>
     %0(s64) = COPY %x0<br>
     %1(s64) = COPY %x1<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>undef.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-undef.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-undef.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>undef.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>undef.mir Tue Nov 14 14:42:19 2017<br>
@@ -13,4 +13,6 @@ body: |<br>
     ; CHECK: [[DEF1:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF<br>
     ; CHECK: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[DEF]](s64), [[DEF1]](s64)<br>
     %0:_(s128) = G_IMPLICIT_DEF<br>
+    %1:_(s64) = G_TRUNC %0<br>
+    %x0 = COPY %1<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>vaarg.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-vaarg.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-vaarg.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>vaarg.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>vaarg.mir Tue Nov 14 14:42:19 2017<br>
@@ -1,3 +1,4 @@<br>
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
 # RUN: llc -O0 -run-pass=legalizer -global-isel %s -o - | FileCheck %s<br>
<br>
 --- |<br>
@@ -10,30 +11,28 @@<br>
 name:            test_vaarg<br>
 body: |<br>
   bb.0:<br>
+    ; CHECK-LABEL: name: test_vaarg<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY %x0<br>
+    ; CHECK: [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[COPY]](p0) :: (load 8)<br>
+    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 8<br>
+    ; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[LOAD]], [[C]](s64)<br>
+    ; CHECK: G_STORE [[GEP]](p0), [[COPY]](p0) :: (store 8)<br>
+    ; CHECK: [[LOAD1:%[0-9]+]]:_(p0) = G_LOAD [[COPY]](p0) :: (load 8)<br>
+    ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 8<br>
+    ; CHECK: [[GEP1:%[0-9]+]]:_(p0) = G_GEP [[LOAD1]], [[C1]](s64)<br>
+    ; CHECK: G_STORE [[GEP1]](p0), [[COPY]](p0) :: (store 8)<br>
+    ; CHECK: [[LOAD2:%[0-9]+]]:_(p0) = G_LOAD [[COPY]](p0) :: (load 8)<br>
+    ; CHECK: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 15<br>
+    ; CHECK: [[GEP2:%[0-9]+]]:_(p0) = G_GEP [[LOAD2]], [[C2]](s64)<br>
+    ; CHECK: [[PTR_MASK:%[0-9]+]]:_(p0) = G_PTR_MASK [[GEP2]], 4<br>
+    ; CHECK: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 8<br>
+    ; CHECK: [[GEP3:%[0-9]+]]:_(p0) = G_GEP [[PTR_MASK]], [[C3]](s64)<br>
+    ; CHECK: G_STORE [[GEP3]](p0), [[COPY]](p0) :: (store 8)<br>
     %0:_(p0) = COPY %x0<br>
<br>
-    ; CHECK-LABEL: name: test_vaarg<br>
-    ; CHECK: [[LIST:%[0-9]+]]:_(p0) = G_LOAD %0(p0) :: (load 8)<br>
-    ; CHECK: %1:_(s8) = G_LOAD [[LIST]](p0) :: (load 1, align 8)<br>
-    ; CHECK: [[SLOTSIZE:%[0-9]+]]:_(s64) = G_CONSTANT i64 8<br>
-    ; CHECK: [[NEXT:%[0-9]+]]:_(p0) = G_GEP [[LIST]], [[SLOTSIZE]](s64)<br>
-    ; CHECK: G_STORE [[NEXT]](p0), %0(p0) :: (store 8)<br>
     %1:_(s8) = G_VAARG %0(p0), 1<br>
<br>
-    ; CHECK: [[LIST:%[0-9]+]]:_(p0) = G_LOAD %0(p0) :: (load 8)<br>
-    ; CHECK: %2:_(s64) = G_LOAD [[LIST]](p0) :: (load 8)<br>
-    ; CHECK: [[SLOTSIZE:%[0-9]+]]:_(s64) = G_CONSTANT i64 8<br>
-    ; CHECK: [[NEXT:%[0-9]+]]:_(p0) = G_GEP [[LIST]], [[SLOTSIZE]](s64)<br>
-    ; CHECK: G_STORE [[NEXT]](p0), %0(p0) :: (store 8)<br>
     %2:_(s64) = G_VAARG %0(p0), 8<br>
<br>
-    ; CHECK: [[LIST:%[0-9]+]]:_(p0) = G_LOAD %0(p0) :: (load 8)<br>
-    ; CHECK: [[ALIGNM1:%[0-9]+]]:_(s64) = G_CONSTANT i64 15<br>
-    ; CHECK: [[ALIGNTMP:%[0-9]+]]:_(p0) = G_GEP [[LIST]], [[ALIGNM1]](s64)<br>
-    ; CHECK: [[LIST:%[0-9]+]]:_(p0) = G_PTR_MASK [[ALIGNTMP]], 4<br>
-    ; CHECK: %3:_(s64) = G_LOAD [[LIST]](p0) :: (load 8, align 16)<br>
-    ; CHECK: [[SLOTSIZE:%[0-9]+]]:_(s64) = G_CONSTANT i64 8<br>
-    ; CHECK: [[NEXT:%[0-9]+]]:_(p0) = G_GEP [[LIST]], [[SLOTSIZE]](s64)<br>
-    ; CHECK: G_STORE [[NEXT]](p0), %0(p0) :: (store 8)<br>
     %3:_(s64) = G_VAARG %0(p0), 16<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>xor.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-xor.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AArch64/GlobalISel/<wbr>legalize-xor.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>xor.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AArch64/GlobalISel/legalize-<wbr>xor.mir Tue Nov 14 14:42:19 2017<br>
@@ -29,8 +29,7 @@ body: |<br>
     ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)<br>
     ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)<br>
     ; CHECK: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[TRUNC]], [[TRUNC1]]<br>
-    ; CHECK: [[TRUNC2:%[0-9]+]]:_(s8) = G_TRUNC [[XOR]](s32)<br>
-    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[TRUNC2]](s8)<br>
+    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[XOR]](s32)<br>
     ; CHECK: %x0 = COPY [[ANYEXT]](s64)<br>
     %0(s64) = COPY %x0<br>
     %1(s64) = COPY %x1<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>add.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/GlobalISel/legalize-add.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AMDGPU/GlobalISel/<wbr>legalize-add.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>add.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>add.mir Tue Nov 14 14:42:19 2017<br>
@@ -22,4 +22,5 @@ body: |<br>
     %0(s32) = COPY %vgpr0<br>
     %1(s32) = COPY %vgpr1<br>
     %2(s32) = G_ADD %0, %1<br>
+    %vgpr0 = COPY %2<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>and.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/GlobalISel/legalize-and.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AMDGPU/GlobalISel/<wbr>legalize-and.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>and.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>and.mir Tue Nov 14 14:42:19 2017<br>
@@ -22,4 +22,5 @@ body: |<br>
     %0(s32) = COPY %vgpr0<br>
     %1(s32) = COPY %vgpr1<br>
     %2(s32) = G_AND %0, %1<br>
+    %vgpr0 = COPY %2<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>bitcast.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/GlobalISel/legalize-bitcast.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AMDGPU/GlobalISel/<wbr>legalize-bitcast.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>bitcast.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>bitcast.mir Tue Nov 14 14:42:19 2017<br>
@@ -22,4 +22,5 @@ body: |<br>
     %0(s32) = COPY %vgpr0<br>
     %1(<2 x s16>) = G_BITCAST %0<br>
     %2(s32) = G_BITCAST %1<br>
+    %vgpr0 = COPY %2<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>constant.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/GlobalISel/legalize-constant.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AMDGPU/GlobalISel/<wbr>legalize-constant.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>constant.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>constant.mir Tue Nov 14 14:42:19 2017<br>
@@ -47,5 +47,7 @@ body: |<br>
     ; CHECK: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.000000e+00<br>
     ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_FCONSTANT float 7.500000e+00<br>
     %0(s32) = G_FCONSTANT float 1.0<br>
+    %vgpr0 = COPY %0<br>
     %1(s32) = G_FCONSTANT float 7.5<br>
+    %vgpr0 = COPY %1<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>fadd.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/GlobalISel/legalize-fadd.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AMDGPU/GlobalISel/<wbr>legalize-fadd.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>fadd.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>fadd.mir Tue Nov 14 14:42:19 2017<br>
@@ -23,4 +23,5 @@ body: |<br>
     %0(s32) = COPY %vgpr0<br>
     %1(s32) = COPY %vgpr1<br>
     %2(s32) = G_FADD %0, %1<br>
+    %vgpr0 = COPY %2<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>fmul.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/GlobalISel/legalize-fmul.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AMDGPU/GlobalISel/<wbr>legalize-fmul.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>fmul.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>fmul.mir Tue Nov 14 14:42:19 2017<br>
@@ -22,4 +22,5 @@ body: |<br>
     %0(s32) = COPY %vgpr0<br>
     %1(s32) = COPY %vgpr1<br>
     %2(s32) = G_FMUL %0, %1<br>
+    %vgpr0 = COPY %2<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>icmp.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/GlobalISel/legalize-icmp.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AMDGPU/GlobalISel/<wbr>legalize-icmp.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>icmp.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>icmp.mir Tue Nov 14 14:42:19 2017<br>
@@ -21,7 +21,11 @@ body: |<br>
     ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY %vgpr0<br>
     ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[C]](s32), [[COPY]]<br>
+    ; CHECK: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s1), [[C]], [[COPY]]<br>
+    ; CHECK: %vgpr0 = COPY [[SELECT]](s32)<br>
     %0(s32) = G_CONSTANT i32 0<br>
     %1(s32) = COPY %vgpr0<br>
     %2(s1) = G_ICMP intpred(ne), %0, %1<br>
+    %3:_(s32) = G_SELECT %2(s1), %0(s32), %1(s32)<br>
+    %vgpr0 = COPY %3<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-or.<wbr>mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/GlobalISel/legalize-or.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AMDGPU/GlobalISel/<wbr>legalize-or.mir?rev=318210&r1=<wbr>318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-or.<wbr>mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-or.<wbr>mir Tue Nov 14 14:42:19 2017<br>
@@ -21,4 +21,5 @@ body: |<br>
     %0(s32) = COPY %vgpr0<br>
     %1(s32) = COPY %vgpr1<br>
     %2(s32) = G_OR %0, %1<br>
+    %vgpr0 = COPY %2<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>select.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/GlobalISel/legalize-select.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AMDGPU/GlobalISel/<wbr>legalize-select.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>select.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>select.mir Tue Nov 14 14:42:19 2017<br>
@@ -31,5 +31,6 @@ body: |<br>
     %3(s32) = G_CONSTANT i32 1<br>
     %4(s32) = G_CONSTANT i32 2<br>
     %5(s32) = G_SELECT %2, %3, %4<br>
+    %vgpr0 = COPY %5<br>
<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>shl.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/GlobalISel/legalize-shl.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AMDGPU/GlobalISel/<wbr>legalize-shl.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>shl.mir (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AMDGPU/GlobalISel/legalize-<wbr>shl.mir Tue Nov 14 14:42:19 2017<br>
@@ -18,4 +18,5 @@ body: |<br>
     %0(s32) = COPY %vgpr0<br>
     %1(s32) = COPY %vgpr1<br>
     %2(s32) = G_SHL %0, %1<br>
+    %vgpr0 = COPY %2<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/ARM/<wbr>GlobalISel/arm-isel.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-isel.ll?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/ARM/GlobalISel/arm-<wbr>isel.ll?rev=318210&r1=318209&<wbr>r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/ARM/<wbr>GlobalISel/arm-isel.ll (original)<br>
+++ llvm/trunk/test/CodeGen/ARM/<wbr>GlobalISel/arm-isel.ll Tue Nov 14 14:42:19 2017<br>
@@ -25,8 +25,9 @@ entry:<br>
<br>
 define signext i1 @test_sext_i1(i1 %x) {<br>
 ; CHECK-LABEL: test_sext_i1<br>
-; CHECK: and r0, r0, #1<br>
-; CHECK: rsb r0, r0, #0<br>
+; CHECK: mov   r1, #31<br>
+; CHECK: lsl   r0, r0, r1<br>
+; CHECK: asr   r0, r0, r1<br>
 ; CHECK: bx lr<br>
 entry:<br>
   ret i1 %x<br>
@@ -34,15 +35,18 @@ entry:<br>
<br>
 define zeroext i8 @test_ext_i8(i8 %x) {<br>
 ; CHECK-LABEL: test_ext_i8:<br>
-; CHECK: uxtb r0, r0<br>
+; CHECK: and r0, r0, #255<br>
 ; CHECK: bx lr<br>
+<br>
 entry:<br>
   ret i8 %x<br>
 }<br>
<br>
 define signext i16 @test_ext_i16(i16 %x) {<br>
 ; CHECK-LABEL: test_ext_i16:<br>
-; CHECK: sxth r0, r0<br>
+; CHECK: mov   r1, #16<br>
+; CHECK: lsl   r0, r0, r1<br>
+; CHECK: asr   r0, r0, r1<br>
 ; CHECK: bx lr<br>
 entry:<br>
   ret i16 %x<br>
<br>
Modified: llvm/trunk/test/CodeGen/ARM/<wbr>GlobalISel/arm-legalize-<wbr>divmod.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-legalize-divmod.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/ARM/GlobalISel/arm-<wbr>legalize-divmod.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/ARM/<wbr>GlobalISel/arm-legalize-<wbr>divmod.mir (original)<br>
+++ llvm/trunk/test/CodeGen/ARM/<wbr>GlobalISel/arm-legalize-<wbr>divmod.mir Tue Nov 14 14:42:19 2017<br>
@@ -139,8 +139,7 @@ body:             |<br>
     ; SOFT-DEFAULT: [[R32:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
     ; SOFT-NOT: G_SDIV<br>
-    ; CHECK: [[R16:%[0-9]+]]:_(s16) = G_TRUNC [[R32]]<br>
-    ; CHECK: [[R:%[0-9]+]]:_(s32) = G_SEXT [[R16]]<br>
+    ; CHECK: [[R:%[0-9]+]]:_(s32) = G_ASHR<br>
     ; SOFT-NOT: G_SDIV<br>
     %4(s16) = G_SDIV %1, %3<br>
     ; CHECK: %r0 = COPY [[R]]<br>
@@ -192,8 +191,7 @@ body:             |<br>
     ; SOFT-DEFAULT: [[R32:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
     ; SOFT-NOT: G_UDIV<br>
-    ; CHECK: [[R16:%[0-9]+]]:_(s16) = G_TRUNC [[R32]]<br>
-    ; CHECK: [[R:%[0-9]+]]:_(s32) = G_ZEXT [[R16]]<br>
+    ; CHECK: [[R:%[0-9]+]]:_(s32) = G_AND<br>
     ; SOFT-NOT: G_UDIV<br>
     %4(s16) = G_UDIV %1, %3<br>
     ; CHECK: %r0 = COPY [[R]]<br>
@@ -247,8 +245,7 @@ body:             |<br>
     ; SOFT-DEFAULT: [[R32:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
     ; SOFT-NOT: G_SDIV<br>
-    ; CHECK: [[R8:%[0-9]+]]:_(s8) = G_TRUNC [[R32]]<br>
-    ; CHECK: [[R:%[0-9]+]]:_(s32) = G_SEXT [[R8]]<br>
+    ; CHECK: [[R:%[0-9]+]]:_(s32) = G_ASHR<br>
     ; SOFT-NOT: G_SDIV<br>
     %4(s8) = G_SDIV %1, %3<br>
     ; CHECK: %r0 = COPY [[R]]<br>
@@ -300,8 +297,7 @@ body:             |<br>
     ; SOFT-DEFAULT: [[R32:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
     ; SOFT-NOT: G_UDIV<br>
-    ; CHECK: [[R8:%[0-9]+]]:_(s8) = G_TRUNC [[R32]]<br>
-    ; CHECK: [[R:%[0-9]+]]:_(s32) = G_ZEXT [[R8]]<br>
+    ; CHECK: [[R:%[0-9]+]]:_(s32) = G_AND<br>
     ; SOFT-NOT: G_UDIV<br>
     %4(s8) = G_UDIV %1, %3<br>
     ; CHECK: %r0 = COPY [[R]]<br>
@@ -433,8 +429,7 @@ body:             |<br>
     ; SOFT-DEFAULT: [[R32:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
     ; SOFT-NOT: G_SREM<br>
-    ; CHECK: [[R16:%[0-9]+]]:_(s16) = G_TRUNC [[R32]]<br>
-    ; CHECK: [[R:%[0-9]+]]:_(s32) = G_SEXT [[R16]]<br>
+    ; CHECK: [[R:%[0-9]+]]:_(s32) = G_ASHR<br>
     ; SOFT-NOT: G_SREM<br>
     %4(s16) = G_SREM %1, %3<br>
     ; CHECK: %r0 = COPY [[R]]<br>
@@ -488,8 +483,7 @@ body:             |<br>
     ; SOFT-DEFAULT: [[R32:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
     ; SOFT-NOT: G_UREM<br>
-    ; CHECK: [[R16:%[0-9]+]]:_(s16) = G_TRUNC [[R32]]<br>
-    ; CHECK: [[R:%[0-9]+]]:_(s32) = G_ZEXT [[R16]]<br>
+    ; CHECK: [[R:%[0-9]+]]:_(s32) = G_AND<br>
     ; SOFT-NOT: G_UREM<br>
     %4(s16) = G_UREM %1, %3<br>
     ; CHECK: %r0 = COPY [[R]]<br>
@@ -545,8 +539,7 @@ body:             |<br>
     ; SOFT-DEFAULT: [[R32:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
     ; SOFT-NOT: G_SREM<br>
-    ; CHECK: [[R8:%[0-9]+]]:_(s8) = G_TRUNC [[R32]]<br>
-    ; CHECK: [[R:%[0-9]+]]:_(s32) = G_SEXT [[R8]]<br>
+    ; CHECK: [[R:%[0-9]+]]:_(s32) = G_ASHR<br>
     ; SOFT-NOT: G_SREM<br>
     %4(s8) = G_SREM %1, %3<br>
     ; CHECK: %r0 = COPY [[R]]<br>
@@ -600,8 +593,7 @@ body:             |<br>
     ; SOFT-DEFAULT: [[R32:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
     ; SOFT-NOT: G_UREM<br>
-    ; CHECK: [[R8:%[0-9]+]]:_(s8) = G_TRUNC [[R32]]<br>
-    ; CHECK: [[R:%[0-9]+]]:_(s32) = G_ZEXT [[R8]]<br>
+    ; CHECK: [[R:%[0-9]+]]:_(s32) = G_AND<br>
     ; SOFT-NOT: G_UREM<br>
     %4(s8) = G_UREM %1, %3<br>
     ; CHECK: %r0 = COPY [[R]]<br>
<br>
Modified: llvm/trunk/test/CodeGen/ARM/<wbr>GlobalISel/arm-legalize-fp.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-legalize-fp.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/ARM/GlobalISel/arm-<wbr>legalize-fp.mir?rev=318210&r1=<wbr>318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/ARM/<wbr>GlobalISel/arm-legalize-fp.mir (original)<br>
+++ llvm/trunk/test/CodeGen/ARM/<wbr>GlobalISel/arm-legalize-fp.mir Tue Nov 14 14:42:19 2017<br>
@@ -435,19 +435,23 @@ body:             |<br>
<br>
     %0(s32) = COPY %r0<br>
     %1(s32) = COPY %r1<br>
-    ; CHECK-DAG: [[X:%[0-9]+]]:_(s32) = COPY %r0<br>
-    ; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY %r1<br>
     %2(s1) = G_FCMP floatpred(true), %0(s32), %1<br>
+    %3(s32) = G_ZEXT %2(s1)<br>
+    %r0 = COPY %3(s32)<br>
+    BX_RET 14, _, implicit %r0<br>
+    ; HARD-DAG: [[X:%[0-9]+]]:_(s32) = COPY %r0<br>
+    ; HARD-DAG: [[Y:%[0-9]+]]:_(s32) = COPY %r1<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(true), [[X]](s32), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
-    ; SOFT: [[REXT:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1<br>
-    ; SOFT: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[REXT]](s32)<br>
+    ; For soft float we just need to return a '-1' constant, but the truncation<br>
+    ; to 1 bit is converted by the combiner to the following masking sequence.<br>
+    ; SOFT: [[R:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1<br>
+    ; SOFT: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[R]](s32)<br>
+    ; SOFT: [[REXT:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-NOT: G_FCMP<br>
-    %3(s32) = G_ZEXT %2(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
-    %r0 = COPY %3(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
-    BX_RET 14, _, implicit %r0<br>
 ...<br>
 ---<br>
 name:            test_fcmp_false_s32<br>
@@ -468,19 +472,23 @@ body:             |<br>
<br>
     %0(s32) = COPY %r0<br>
     %1(s32) = COPY %r1<br>
-    ; CHECK-DAG: [[X:%[0-9]+]]:_(s32) = COPY %r0<br>
-    ; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY %r1<br>
     %2(s1) = G_FCMP floatpred(false), %0(s32), %1<br>
+    %3(s32) = G_ZEXT %2(s1)<br>
+    %r0 = COPY %3(s32)<br>
+    BX_RET 14, _, implicit %r0<br>
+    ; HARD-DAG: [[X:%[0-9]+]]:_(s32) = COPY %r0<br>
+    ; HARD-DAG: [[Y:%[0-9]+]]:_(s32) = COPY %r1<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(false), [[X]](s32), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
-    ; SOFT: [[REXT:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
-    ; SOFT: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[REXT]](s32)<br>
+    ; For soft float we just need to return a '0' constant, but the truncation<br>
+    ; to 1 bit is converted by the combiner to the following masking sequence.<br>
+    ; SOFT: [[R:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
+    ; SOFT: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[R]](s32)<br>
+    ; SOFT: [[REXT:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-NOT: G_FCMP<br>
-    %3(s32) = G_ZEXT %2(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
-    %r0 = COPY %3(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
-    BX_RET 14, _, implicit %r0<br>
 ...<br>
 ---<br>
 name:            test_fcmp_oeq_s32<br>
@@ -505,6 +513,7 @@ body:             |<br>
     ; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY %r1<br>
     %2(s1) = G_FCMP floatpred(oeq), %0(s32), %1<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(oeq), [[X]](s32), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     ; SOFT: ADJCALLSTACKDOWN<br>
     ; SOFT-DAG: %r0 = COPY [[X]]<br>
@@ -513,12 +522,16 @@ body:             |<br>
     ; SOFT-DEFAULT: BL $__eqsf2, {{.*}}, implicit %r0, implicit %r1, implicit-def %r0<br>
     ; SOFT: [[RET:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
-    ; SOFT-AEABI: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[RET]](s32)<br>
+    ; For aeabi, we just need to truncate the result. The combiner changes the<br>
+    ; truncation into the following masking sequence.<br>
+    ; SOFT-AEABI: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT-AEABI: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[RET]](s32)<br>
+    ; SOFT-AEABI: [[REXT:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-DEFAULT: [[ZERO:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
     ; SOFT-DEFAULT: [[R:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[RET]](s32), [[ZERO]]<br>
+    ; SOFT-DEFAULT: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     %3(s32) = G_ZEXT %2(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     %r0 = COPY %3(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
     BX_RET 14, _, implicit %r0<br>
@@ -546,6 +559,7 @@ body:             |<br>
     ; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY %r1<br>
     %2(s1) = G_FCMP floatpred(ogt), %0(s32), %1<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(ogt), [[X]](s32), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     ; SOFT: ADJCALLSTACKDOWN<br>
     ; SOFT-DAG: %r0 = COPY [[X]]<br>
@@ -554,12 +568,16 @@ body:             |<br>
     ; SOFT-DEFAULT: BL $__gtsf2, {{.*}}, implicit %r0, implicit %r1, implicit-def %r0<br>
     ; SOFT: [[RET:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
-    ; SOFT-AEABI: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[RET]](s32)<br>
+    ; For aeabi, we just need to truncate the result. The combiner changes the<br>
+    ; truncation into the following masking sequence.<br>
+    ; SOFT-AEABI: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT-AEABI: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[RET]](s32)<br>
+    ; SOFT-AEABI: [[R:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-DEFAULT: [[ZERO:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
     ; SOFT-DEFAULT: [[R:%[0-9]+]]:_(s1) = G_ICMP intpred(sgt), [[RET]](s32), [[ZERO]]<br>
+    ; SOFT-DEFAULT: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     %3(s32) = G_ZEXT %2(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     %r0 = COPY %3(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
     BX_RET 14, _, implicit %r0<br>
@@ -587,6 +605,7 @@ body:             |<br>
     ; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY %r1<br>
     %2(s1) = G_FCMP floatpred(oge), %0(s32), %1<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(oge), [[X]](s32), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     ; SOFT: ADJCALLSTACKDOWN<br>
     ; SOFT-DAG: %r0 = COPY [[X]]<br>
@@ -595,12 +614,16 @@ body:             |<br>
     ; SOFT-DEFAULT: BL $__gesf2, {{.*}}, implicit %r0, implicit %r1, implicit-def %r0<br>
     ; SOFT: [[RET:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
-    ; SOFT-AEABI: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[RET]](s32)<br>
+    ; For aeabi, we just need to truncate the result. The combiner changes the<br>
+    ; truncation into the following masking sequence.<br>
+    ; SOFT-AEABI: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT-AEABI: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[RET]](s32)<br>
+    ; SOFT-AEABI: [[R:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-DEFAULT: [[ZERO:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
     ; SOFT-DEFAULT: [[R:%[0-9]+]]:_(s1) = G_ICMP intpred(sge), [[RET]](s32), [[ZERO]]<br>
+    ; SOFT-DEFAULT: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     %3(s32) = G_ZEXT %2(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     %r0 = COPY %3(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
     BX_RET 14, _, implicit %r0<br>
@@ -628,6 +651,7 @@ body:             |<br>
     ; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY %r1<br>
     %2(s1) = G_FCMP floatpred(olt), %0(s32), %1<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(olt), [[X]](s32), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     ; SOFT: ADJCALLSTACKDOWN<br>
     ; SOFT-DAG: %r0 = COPY [[X]]<br>
@@ -636,12 +660,16 @@ body:             |<br>
     ; SOFT-DEFAULT: BL $__ltsf2, {{.*}}, implicit %r0, implicit %r1, implicit-def %r0<br>
     ; SOFT: [[RET:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
-    ; SOFT-AEABI: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[RET]](s32)<br>
+    ; For aeabi, we just need to truncate the result. The combiner changes the<br>
+    ; truncation into the following masking sequence.<br>
+    ; SOFT-AEABI: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT-AEABI: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[RET]](s32)<br>
+    ; SOFT-AEABI: [[R:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-DEFAULT: [[ZERO:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
     ; SOFT-DEFAULT: [[R:%[0-9]+]]:_(s1) = G_ICMP intpred(slt), [[RET]](s32), [[ZERO]]<br>
+    ; SOFT-DEFAULT: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     %3(s32) = G_ZEXT %2(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     %r0 = COPY %3(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
     BX_RET 14, _, implicit %r0<br>
@@ -669,6 +697,7 @@ body:             |<br>
     ; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY %r1<br>
     %2(s1) = G_FCMP floatpred(ole), %0(s32), %1<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(ole), [[X]](s32), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     ; SOFT: ADJCALLSTACKDOWN<br>
     ; SOFT-DAG: %r0 = COPY [[X]]<br>
@@ -677,12 +706,16 @@ body:             |<br>
     ; SOFT-DEFAULT: BL $__lesf2, {{.*}}, implicit %r0, implicit %r1, implicit-def %r0<br>
     ; SOFT: [[RET:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
-    ; SOFT-AEABI: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[RET]](s32)<br>
+    ; For aeabi, we just need to truncate the result. The combiner changes the<br>
+    ; truncation into the following masking sequence.<br>
+    ; SOFT-AEABI: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT-AEABI: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[RET]](s32)<br>
+    ; SOFT-AEABI: [[R:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-DEFAULT: [[ZERO:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
     ; SOFT-DEFAULT: [[R:%[0-9]+]]:_(s1) = G_ICMP intpred(sle), [[RET]](s32), [[ZERO]]<br>
+    ; SOFT-DEFAULT: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     %3(s32) = G_ZEXT %2(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     %r0 = COPY %3(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
     BX_RET 14, _, implicit %r0<br>
@@ -955,6 +988,7 @@ body:             |<br>
     ; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY %r1<br>
     %2(s1) = G_FCMP floatpred(uno), %0(s32), %1<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(uno), [[X]](s32), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     ; SOFT: ADJCALLSTACKDOWN<br>
     ; SOFT-DAG: %r0 = COPY [[X]]<br>
@@ -963,12 +997,16 @@ body:             |<br>
     ; SOFT-DEFAULT: BL $__unordsf2, {{.*}}, implicit %r0, implicit %r1, implicit-def %r0<br>
     ; SOFT: [[RET:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
-    ; SOFT-AEABI: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[RET]](s32)<br>
+    ; For aeabi, we just need to truncate the result. The combiner changes the<br>
+    ; truncation into the following masking sequence.<br>
+    ; SOFT-AEABI: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT-AEABI: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[RET]](s32)<br>
+    ; SOFT-AEABI: [[R:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-DEFAULT: [[ZERO:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
     ; SOFT-DEFAULT: [[R:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[RET]](s32), [[ZERO]]<br>
+    ; SOFT-DEFAULT: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     %3(s32) = G_ZEXT %2(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     %r0 = COPY %3(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
     BX_RET 14, _, implicit %r0<br>
@@ -996,6 +1034,7 @@ body:             |<br>
     ; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY %r1<br>
     %2(s1) = G_FCMP floatpred(one), %0(s32), %1<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(one), [[X]](s32), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     ; SOFT: ADJCALLSTACKDOWN<br>
     ; SOFT-DAG: %r0 = COPY [[X]]<br>
@@ -1020,11 +1059,14 @@ body:             |<br>
     ; SOFT-AEABI: [[R2EXT:%[0-9]+]]:_(s32) = COPY [[RET2]]<br>
     ; SOFT-DEFAULT: [[R1EXT:%[0-9]+]]:_(s32) = G_ANYEXT [[R1]]<br>
     ; SOFT-DEFAULT: [[R2EXT:%[0-9]+]]:_(s32) = G_ANYEXT [[R2]]<br>
-    ; SOFT: [[REXT:%[0-9]+]]:_(s32) = G_OR [[R1EXT]], [[R2EXT]]<br>
-    ; SOFT: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[REXT]]<br>
+    ; SOFT: [[R:%[0-9]+]]:_(s32) = G_OR [[R1EXT]], [[R2EXT]]<br>
+    ; The result of the G_OR needs to be truncated, and the combiner turns the<br>
+    ; truncation into the following masking sequence.<br>
+    ; SOFT: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[R]]<br>
+    ; SOFT: [[REXT:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-NOT: G_FCMP<br>
     %3(s32) = G_ZEXT %2(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     %r0 = COPY %3(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
     BX_RET 14, _, implicit %r0<br>
@@ -1052,6 +1094,7 @@ body:             |<br>
     ; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY %r1<br>
     %2(s1) = G_FCMP floatpred(ueq), %0(s32), %1<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(ueq), [[X]](s32), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     ; SOFT: ADJCALLSTACKDOWN<br>
     ; SOFT-DAG: %r0 = COPY [[X]]<br>
@@ -1076,11 +1119,14 @@ body:             |<br>
     ; SOFT-AEABI: [[R2EXT:%[0-9]+]]:_(s32) = COPY [[RET2]]<br>
     ; SOFT-DEFAULT: [[R1EXT:%[0-9]+]]:_(s32) = G_ANYEXT [[R1]]<br>
     ; SOFT-DEFAULT: [[R2EXT:%[0-9]+]]:_(s32) = G_ANYEXT [[R2]]<br>
-    ; SOFT: [[REXT:%[0-9]+]]:_(s32) = G_OR [[R1EXT]], [[R2EXT]]<br>
-    ; SOFT: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[REXT]]<br>
+    ; SOFT: [[R:%[0-9]+]]:_(s32) = G_OR [[R1EXT]], [[R2EXT]]<br>
+    ; The result of the G_OR needs to be truncated, and the combiner turns the<br>
+    ; truncation into the following masking sequence.<br>
+    ; SOFT: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[R]]<br>
+    ; SOFT: [[REXT:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-NOT: G_FCMP<br>
     %3(s32) = G_ZEXT %2(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     %r0 = COPY %3(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
     BX_RET 14, _, implicit %r0<br>
@@ -1120,12 +1166,16 @@ body:             |<br>
     ; HARD-DAG: [[Y:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[Y0]](s32), [[Y1]](s32)<br>
     %6(s1) = G_FCMP floatpred(true), %4(s64), %5<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(true), [[X]](s64), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
-    ; SOFT: [[REXT:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1<br>
-    ; SOFT: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[REXT]](s32)<br>
+    ; SOFT: [[R:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1<br>
+    ; The result needs to be truncated, and the combiner turns the truncation<br>
+    ; into the following masking sequence.<br>
+    ; SOFT: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[R]]<br>
+    ; SOFT: [[REXT:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-NOT: G_FCMP<br>
     %7(s32) = G_ZEXT %6(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     %r0 = COPY %7(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
     BX_RET 14, _, implicit %r0<br>
@@ -1165,12 +1215,17 @@ body:             |<br>
     ; HARD-DAG: [[Y:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[Y0]](s32), [[Y1]](s32)<br>
     %6(s1) = G_FCMP floatpred(false), %4(s64), %5<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(false), [[X]](s64), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
+    ; SOFT-NOT: G_FCMP<br>
+    ; SOFT: [[R:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
+    ; The result needs to be truncated, and the combiner turns the truncation<br>
+    ; into the following masking sequence.<br>
+    ; SOFT: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[R]]<br>
+    ; SOFT: [[REXT:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-NOT: G_FCMP<br>
-    ; SOFT: [[REXT:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
-    ; SOFT: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[REXT]](s32)<br>
     ; SOFT-NOT: G_FCMP<br>
     %7(s32) = G_ZEXT %6(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     %r0 = COPY %7(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
     BX_RET 14, _, implicit %r0<br>
@@ -1210,6 +1265,7 @@ body:             |<br>
     ; HARD-DAG: [[Y:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[Y0]](s32), [[Y1]](s32)<br>
     %6(s1) = G_FCMP floatpred(oeq), %4(s64), %5<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(oeq), [[X]](s64), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     ; SOFT: ADJCALLSTACKDOWN<br>
     ; SOFT-DAG: %r0 = COPY [[X0]]<br>
@@ -1220,12 +1276,16 @@ body:             |<br>
     ; SOFT-DEFAULT: BL $__eqdf2, {{.*}}, implicit %r0, implicit %r1, implicit %r2, implicit %r3, implicit-def %r0<br>
     ; SOFT: [[RET:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
-    ; SOFT-AEABI: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[RET]](s32)<br>
+    ; For aeabi, we just need to truncate the result. The combiner changes the<br>
+    ; truncation into the following masking sequence.<br>
+    ; SOFT-AEABI: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT-AEABI: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[RET]](s32)<br>
+    ; SOFT-AEABI: [[REXT:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-DEFAULT: [[ZERO:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
     ; SOFT-DEFAULT: [[R:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[RET]](s32), [[ZERO]]<br>
+    ; SOFT-DEFAULT: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     %7(s32) = G_ZEXT %6(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     %r0 = COPY %7(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
     BX_RET 14, _, implicit %r0<br>
@@ -1265,6 +1325,7 @@ body:             |<br>
     ; HARD-DAG: [[Y:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[Y0]](s32), [[Y1]](s32)<br>
     %6(s1) = G_FCMP floatpred(ogt), %4(s64), %5<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(ogt), [[X]](s64), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     ; SOFT: ADJCALLSTACKDOWN<br>
     ; SOFT-DAG: %r0 = COPY [[X0]]<br>
@@ -1275,12 +1336,16 @@ body:             |<br>
     ; SOFT-DEFAULT: BL $__gtdf2, {{.*}}, implicit %r0, implicit %r1, implicit %r2, implicit %r3, implicit-def %r0<br>
     ; SOFT: [[RET:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
-    ; SOFT-AEABI: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[RET]](s32)<br>
+    ; For aeabi, we just need to truncate the result. The combiner changes the<br>
+    ; truncation into the following masking sequence.<br>
+    ; SOFT-AEABI: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT-AEABI: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[RET]](s32)<br>
+    ; SOFT-AEABI: [[REXT:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-DEFAULT: [[ZERO:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
     ; SOFT-DEFAULT: [[R:%[0-9]+]]:_(s1) = G_ICMP intpred(sgt), [[RET]](s32), [[ZERO]]<br>
+    ; SOFT-DEFAULT: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     %7(s32) = G_ZEXT %6(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     %r0 = COPY %7(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
     BX_RET 14, _, implicit %r0<br>
@@ -1320,6 +1385,7 @@ body:             |<br>
     ; HARD-DAG: [[Y:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[Y0]](s32), [[Y1]](s32)<br>
     %6(s1) = G_FCMP floatpred(oge), %4(s64), %5<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(oge), [[X]](s64), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     ; SOFT: ADJCALLSTACKDOWN<br>
     ; SOFT-DAG: %r0 = COPY [[X0]]<br>
@@ -1330,12 +1396,16 @@ body:             |<br>
     ; SOFT-DEFAULT: BL $__gedf2, {{.*}}, implicit %r0, implicit %r1, implicit %r2, implicit %r3, implicit-def %r0<br>
     ; SOFT: [[RET:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
-    ; SOFT-AEABI: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[RET]](s32)<br>
+    ; For aeabi, we just need to truncate the result. The combiner changes the<br>
+    ; truncation into the following masking sequence.<br>
+    ; SOFT-AEABI: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT-AEABI: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[RET]](s32)<br>
+    ; SOFT-AEABI: [[REXT:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-DEFAULT: [[ZERO:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
     ; SOFT-DEFAULT: [[R:%[0-9]+]]:_(s1) = G_ICMP intpred(sge), [[RET]](s32), [[ZERO]]<br>
+    ; SOFT-DEFAULT: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     %7(s32) = G_ZEXT %6(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     %r0 = COPY %7(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
     BX_RET 14, _, implicit %r0<br>
@@ -1375,6 +1445,7 @@ body:             |<br>
     ; HARD-DAG: [[Y:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[Y0]](s32), [[Y1]](s32)<br>
     %6(s1) = G_FCMP floatpred(olt), %4(s64), %5<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(olt), [[X]](s64), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     ; SOFT: ADJCALLSTACKDOWN<br>
     ; SOFT-DAG: %r0 = COPY [[X0]]<br>
@@ -1385,12 +1456,16 @@ body:             |<br>
     ; SOFT-DEFAULT: BL $__ltdf2, {{.*}}, implicit %r0, implicit %r1, implicit %r2, implicit %r3, implicit-def %r0<br>
     ; SOFT: [[RET:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
-    ; SOFT-AEABI: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[RET]](s32)<br>
+    ; For aeabi, we just need to truncate the result. The combiner changes the<br>
+    ; truncation into the following masking sequence.<br>
+    ; SOFT-AEABI: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT-AEABI: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[RET]](s32)<br>
+    ; SOFT-AEABI: [[REXT:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-DEFAULT: [[ZERO:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
     ; SOFT-DEFAULT: [[R:%[0-9]+]]:_(s1) = G_ICMP intpred(slt), [[RET]](s32), [[ZERO]]<br>
+    ; SOFT-DEFAULT: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     %7(s32) = G_ZEXT %6(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     %r0 = COPY %7(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
     BX_RET 14, _, implicit %r0<br>
@@ -1430,6 +1505,7 @@ body:             |<br>
     ; HARD-DAG: [[Y:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[Y0]](s32), [[Y1]](s32)<br>
     %6(s1) = G_FCMP floatpred(ole), %4(s64), %5<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(ole), [[X]](s64), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     ; SOFT: ADJCALLSTACKDOWN<br>
     ; SOFT-DAG: %r0 = COPY [[X0]]<br>
@@ -1440,12 +1516,16 @@ body:             |<br>
     ; SOFT-DEFAULT: BL $__ledf2, {{.*}}, implicit %r0, implicit %r1, implicit %r2, implicit %r3, implicit-def %r0<br>
     ; SOFT: [[RET:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
-    ; SOFT-AEABI: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[RET]](s32)<br>
+    ; For aeabi, we just need to truncate the result. The combiner changes the<br>
+    ; truncation into the following masking sequence.<br>
+    ; SOFT-AEABI: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT-AEABI: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[RET]](s32)<br>
+    ; SOFT-AEABI: [[REXT:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-DEFAULT: [[ZERO:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
     ; SOFT-DEFAULT: [[R:%[0-9]+]]:_(s1) = G_ICMP intpred(sle), [[RET]](s32), [[ZERO]]<br>
+    ; SOFT-DEFAULT: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     %7(s32) = G_ZEXT %6(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     %r0 = COPY %7(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
     BX_RET 14, _, implicit %r0<br>
@@ -1814,6 +1894,7 @@ body:             |<br>
     ; HARD-DAG: [[Y:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[Y0]](s32), [[Y1]](s32)<br>
     %6(s1) = G_FCMP floatpred(uno), %4(s64), %5<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(uno), [[X]](s64), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     ; SOFT: ADJCALLSTACKDOWN<br>
     ; SOFT-DAG: %r0 = COPY [[X0]]<br>
@@ -1824,12 +1905,16 @@ body:             |<br>
     ; SOFT-DEFAULT: BL $__unorddf2, {{.*}}, implicit %r0, implicit %r1, implicit %r2, implicit %r3, implicit-def %r0<br>
     ; SOFT: [[RET:%[0-9]+]]:_(s32) = COPY %r0<br>
     ; SOFT: ADJCALLSTACKUP<br>
-    ; SOFT-AEABI: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[RET]](s32)<br>
+    ; For aeabi, we just need to truncate the result. The combiner changes the<br>
+    ; truncation into the following masking sequence.<br>
+    ; SOFT-AEABI: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT-AEABI: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[RET]](s32)<br>
+    ; SOFT-AEABI: [[REXT:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-DEFAULT: [[ZERO:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
     ; SOFT-DEFAULT: [[R:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[RET]](s32), [[ZERO]]<br>
+    ; SOFT-DEFAULT: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     %7(s32) = G_ZEXT %6(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     %r0 = COPY %7(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
     BX_RET 14, _, implicit %r0<br>
@@ -1869,6 +1954,7 @@ body:             |<br>
     ; HARD-DAG: [[Y:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[Y0]](s32), [[Y1]](s32)<br>
     %6(s1) = G_FCMP floatpred(one), %4(s64), %5<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(one), [[X]](s64), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     ; SOFT: ADJCALLSTACKDOWN<br>
     ; SOFT-DAG: %r0 = COPY [[X0]]<br>
@@ -1897,11 +1983,14 @@ body:             |<br>
     ; SOFT-AEABI: [[R2EXT:%[0-9]+]]:_(s32) = COPY [[RET2]]<br>
     ; SOFT-DEFAULT: [[R1EXT:%[0-9]+]]:_(s32) = G_ANYEXT [[R1]]<br>
     ; SOFT-DEFAULT: [[R2EXT:%[0-9]+]]:_(s32) = G_ANYEXT [[R2]]<br>
-    ; SOFT: [[REXT:%[0-9]+]]:_(s32) = G_OR [[R1EXT]], [[R2EXT]]<br>
-    ; SOFT: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[REXT]]<br>
+    ; SOFT: [[R:%[0-9]+]]:_(s32) = G_OR [[R1EXT]], [[R2EXT]]<br>
+    ; The result of the G_OR needs to be truncated, and the combiner turns the<br>
+    ; truncation into the following masking sequence.<br>
+    ; SOFT: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[R]]<br>
+    ; SOFT: [[REXT:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-NOT: G_FCMP<br>
     %7(s32) = G_ZEXT %6(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     %r0 = COPY %7(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
     BX_RET 14, _, implicit %r0<br>
@@ -1941,6 +2030,7 @@ body:             |<br>
     ; HARD-DAG: [[Y:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[Y0]](s32), [[Y1]](s32)<br>
     %6(s1) = G_FCMP floatpred(ueq), %4(s64), %5<br>
     ; HARD: [[R:%[0-9]+]]:_(s1) = G_FCMP floatpred(ueq), [[X]](s64), [[Y]]<br>
+    ; HARD: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     ; SOFT-NOT: G_FCMP<br>
     ; SOFT: ADJCALLSTACKDOWN<br>
     ; SOFT-DAG: %r0 = COPY [[X0]]<br>
@@ -1969,11 +2059,14 @@ body:             |<br>
     ; SOFT-AEABI: [[R2EXT:%[0-9]+]]:_(s32) = COPY [[RET2]]<br>
     ; SOFT-DEFAULT: [[R1EXT:%[0-9]+]]:_(s32) = G_ANYEXT [[R1]]<br>
     ; SOFT-DEFAULT: [[R2EXT:%[0-9]+]]:_(s32) = G_ANYEXT [[R2]]<br>
-    ; SOFT: [[REXT:%[0-9]+]]:_(s32) = G_OR [[R1EXT]], [[R2EXT]]<br>
-    ; SOFT: [[R:%[0-9]+]]:_(s1) = G_TRUNC [[REXT]]<br>
+    ; SOFT: [[R:%[0-9]+]]:_(s32) = G_OR [[R1EXT]], [[R2EXT]]<br>
+    ; The result of the G_OR needs to be truncated, and the combiner turns the<br>
+    ; truncation into the following masking sequence.<br>
+    ; SOFT: [[MASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; SOFT: [[RCOPY:%[0-9]+]]:_(s32) = COPY [[R]]<br>
+    ; SOFT: [[REXT:%[0-9]+]]:_(s32) = G_AND [[RCOPY]], [[MASK]]<br>
     ; SOFT-NOT: G_FCMP<br>
     %7(s32) = G_ZEXT %6(s1)<br>
-    ; CHECK: [[REXT:%[0-9]+]]:_(s32) = G_ZEXT [[R]](s1)<br>
     %r0 = COPY %7(s32)<br>
     ; CHECK: %r0 = COPY [[REXT]]<br>
     BX_RET 14, _, implicit %r0<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/add-scalar.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/add-scalar.ll?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/add-<wbr>scalar.ll?rev=318210&r1=<wbr>318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/add-scalar.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/add-scalar.ll Tue Nov 14 14:42:19 2017<br>
@@ -35,8 +35,8 @@ define i32 @test_add_i32(i32 %arg1, i32<br>
 ;<br>
 ; X32-LABEL: test_add_i32:<br>
 ; X32:       # BB#0:<br>
-; X32-NEXT:    movl 8(%esp), %eax<br>
-; X32-NEXT:    addl 4(%esp), %eax<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
+; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax<br>
 ; X32-NEXT:    retl<br>
   %ret = add i32 %arg1, %arg2<br>
   ret i32 %ret<br>
@@ -53,8 +53,8 @@ define i16 @test_add_i16(i16 %arg1, i16<br>
 ;<br>
 ; X32-LABEL: test_add_i16:<br>
 ; X32:       # BB#0:<br>
-; X32-NEXT:    movzwl 8(%esp), %eax<br>
-; X32-NEXT:    addw 4(%esp), %ax<br>
+; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
+; X32-NEXT:    addw {{[0-9]+}}(%esp), %ax<br>
 ; X32-NEXT:    retl<br>
   %ret = add i16 %arg1, %arg2<br>
   ret i16 %ret<br>
@@ -69,8 +69,8 @@ define i8 @test_add_i8(i8 %arg1, i8 %arg<br>
 ;<br>
 ; X32-LABEL: test_add_i8:<br>
 ; X32:       # BB#0:<br>
-; X32-NEXT:    movb 8(%esp), %al<br>
-; X32-NEXT:    addb 4(%esp), %al<br>
+; X32-NEXT:    movb {{[0-9]+}}(%esp), %al<br>
+; X32-NEXT:    addb {{[0-9]+}}(%esp), %al<br>
 ; X32-NEXT:    retl<br>
   %ret = add i8 %arg1, %arg2<br>
   ret i8 %ret<br>
@@ -82,15 +82,17 @@ define i32 @test_add_i1(i32 %arg1, i32 %<br>
 ; X64-NEXT:    cmpl %esi, %edi<br>
 ; X64-NEXT:    sete %al<br>
 ; X64-NEXT:    addb %al, %al<br>
+; X64-NEXT:    movzbl %al, %eax<br>
 ; X64-NEXT:    andl $1, %eax<br>
 ; X64-NEXT:    retq<br>
 ;<br>
 ; X32-LABEL: test_add_i1:<br>
 ; X32:       # BB#0:<br>
-; X32-NEXT:    movl 8(%esp), %eax<br>
-; X32-NEXT:    cmpl %eax, 4(%esp)<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
+; X32-NEXT:    cmpl %eax, {{[0-9]+}}(%esp)<br>
 ; X32-NEXT:    sete %al<br>
 ; X32-NEXT:    addb %al, %al<br>
+; X32-NEXT:    movzbl %al, %eax<br>
 ; X32-NEXT:    andl $1, %eax<br>
 ; X32-NEXT:    retl<br>
   %c = icmp eq i32 %arg1, %arg2<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/and-scalar.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/and-scalar.ll?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/and-<wbr>scalar.ll?rev=318210&r1=<wbr>318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/and-scalar.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/and-scalar.ll Tue Nov 14 14:42:19 2017<br>
@@ -7,6 +7,7 @@ define i32 @test_and_i1(i32 %arg1, i32 %<br>
 ; ALL-NEXT:    cmpl %esi, %edi<br>
 ; ALL-NEXT:    sete %al<br>
 ; ALL-NEXT:    andb %al, %al<br>
+; ALL-NEXT:    movzbl %al, %eax<br>
 ; ALL-NEXT:    andl $1, %eax<br>
 ; ALL-NEXT:    retq<br>
   %c = icmp eq i32 %arg1, %arg2<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/ext.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/ext.ll?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/ext.ll?<wbr>rev=318210&r1=318209&r2=<wbr>318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/ext.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/ext.ll Tue Nov 14 14:42:19 2017<br>
@@ -11,7 +11,7 @@ define i8 @test_zext_i1toi8(i32 %a) {<br>
 ;<br>
 ; X32-LABEL: test_zext_i1toi8:<br>
 ; X32:       # BB#0:<br>
-; X32-NEXT:    movl 4(%esp), %eax<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
 ; X32-NEXT:    andb $1, %al<br>
 ; X32-NEXT:    # kill: %AL<def> %AL<kill> %EAX<kill><br>
 ; X32-NEXT:    retl<br>
@@ -29,7 +29,7 @@ define i16 @test_zext_i1toi16(i32 %a) {<br>
 ;<br>
 ; X32-LABEL: test_zext_i1toi16:<br>
 ; X32:       # BB#0:<br>
-; X32-NEXT:    movl 4(%esp), %eax<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
 ; X32-NEXT:    andw $1, %ax<br>
 ; X32-NEXT:    # kill: %AX<def> %AX<kill> %EAX<kill><br>
 ; X32-NEXT:    retl<br>
@@ -47,7 +47,7 @@ define i32 @test_zext_i1(i32 %a) {<br>
 ;<br>
 ; X32-LABEL: test_zext_i1:<br>
 ; X32:       # BB#0:<br>
-; X32-NEXT:    movl 4(%esp), %eax<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
 ; X32-NEXT:    andl $1, %eax<br>
 ; X32-NEXT:    retl<br>
   %val = trunc i32 %a to i1<br>
@@ -63,7 +63,7 @@ define i32 @test_zext_i8(i8 %val) {<br>
 ;<br>
 ; X32-LABEL: test_zext_i8:<br>
 ; X32:       # BB#0:<br>
-; X32-NEXT:    movzbl 4(%esp), %eax<br>
+; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax<br>
 ; X32-NEXT:    retl<br>
   %r = zext i8 %val to i32<br>
   ret i32 %r<br>
@@ -77,7 +77,7 @@ define i32 @test_zext_i16(i16 %val) {<br>
 ;<br>
 ; X32-LABEL: test_zext_i16:<br>
 ; X32:       # BB#0:<br>
-; X32-NEXT:    movzwl 4(%esp), %eax<br>
+; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
 ; X32-NEXT:    retl<br>
   %r = zext i16 %val to i32<br>
   ret i32 %r<br>
@@ -91,7 +91,7 @@ define i32 @test_sext_i8(i8 %val) {<br>
 ;<br>
 ; X32-LABEL: test_sext_i8:<br>
 ; X32:       # BB#0:<br>
-; X32-NEXT:    movsbl 4(%esp), %eax<br>
+; X32-NEXT:    movsbl {{[0-9]+}}(%esp), %eax<br>
 ; X32-NEXT:    retl<br>
   %r = sext i8 %val to i32<br>
   ret i32 %r<br>
@@ -105,7 +105,7 @@ define i32 @test_sext_i16(i16 %val) {<br>
 ;<br>
 ; X32-LABEL: test_sext_i16:<br>
 ; X32:       # BB#0:<br>
-; X32-NEXT:    movswl 4(%esp), %eax<br>
+; X32-NEXT:    movswl {{[0-9]+}}(%esp), %eax<br>
 ; X32-NEXT:    retl<br>
   %r = sext i16 %val to i32<br>
   ret i32 %r<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-add-v128.<wbr>mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-add-v128.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-add-v128.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-add-v128.<wbr>mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-add-v128.<wbr>mir Tue Nov 14 14:42:19 2017<br>
@@ -39,10 +39,12 @@ body:             |<br>
     ; ALL: [[DEF:%[0-9]+]]:_(<16 x s8>) = IMPLICIT_DEF<br>
     ; ALL: [[DEF1:%[0-9]+]]:_(<16 x s8>) = IMPLICIT_DEF<br>
     ; ALL: [[ADD:%[0-9]+]]:_(<16 x s8>) = G_ADD [[DEF]], [[DEF1]]<br>
+    ; ALL: %xmm0 = COPY [[ADD]](<16 x s8>)<br>
     ; ALL: RET 0<br>
     %0(<16 x s8>) = IMPLICIT_DEF<br>
     %1(<16 x s8>) = IMPLICIT_DEF<br>
     %2(<16 x s8>) = G_ADD %0, %1<br>
+    %xmm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
@@ -63,10 +65,12 @@ body:             |<br>
     ; ALL: [[DEF:%[0-9]+]]:_(<8 x s16>) = IMPLICIT_DEF<br>
     ; ALL: [[DEF1:%[0-9]+]]:_(<8 x s16>) = IMPLICIT_DEF<br>
     ; ALL: [[ADD:%[0-9]+]]:_(<8 x s16>) = G_ADD [[DEF]], [[DEF1]]<br>
+    ; ALL: %xmm0 = COPY [[ADD]](<8 x s16>)<br>
     ; ALL: RET 0<br>
     %0(<8 x s16>) = IMPLICIT_DEF<br>
     %1(<8 x s16>) = IMPLICIT_DEF<br>
     %2(<8 x s16>) = G_ADD %0, %1<br>
+    %xmm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
@@ -87,10 +91,12 @@ body:             |<br>
     ; ALL: [[DEF:%[0-9]+]]:_(<4 x s32>) = IMPLICIT_DEF<br>
     ; ALL: [[DEF1:%[0-9]+]]:_(<4 x s32>) = IMPLICIT_DEF<br>
     ; ALL: [[ADD:%[0-9]+]]:_(<4 x s32>) = G_ADD [[DEF]], [[DEF1]]<br>
+    ; ALL: %xmm0 = COPY [[ADD]](<4 x s32>)<br>
     ; ALL: RET 0<br>
     %0(<4 x s32>) = IMPLICIT_DEF<br>
     %1(<4 x s32>) = IMPLICIT_DEF<br>
     %2(<4 x s32>) = G_ADD %0, %1<br>
+    %xmm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
@@ -111,10 +117,12 @@ body:             |<br>
     ; ALL: [[DEF:%[0-9]+]]:_(<2 x s64>) = IMPLICIT_DEF<br>
     ; ALL: [[DEF1:%[0-9]+]]:_(<2 x s64>) = IMPLICIT_DEF<br>
     ; ALL: [[ADD:%[0-9]+]]:_(<2 x s64>) = G_ADD [[DEF]], [[DEF1]]<br>
+    ; ALL: %xmm0 = COPY [[ADD]](<2 x s64>)<br>
     ; ALL: RET 0<br>
     %0(<2 x s64>) = IMPLICIT_DEF<br>
     %1(<2 x s64>) = IMPLICIT_DEF<br>
     %2(<2 x s64>) = G_ADD %0, %1<br>
+    %xmm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-add-v256.<wbr>mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-add-v256.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-add-v256.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-add-v256.<wbr>mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-add-v256.<wbr>mir Tue Nov 14 14:42:19 2017<br>
@@ -1,3 +1,4 @@<br>
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
 # RUN: llc -mtriple=x86_64-linux-gnu -mattr=+sse2 -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=NOT_AVX2 --check-prefix=SSE2<br>
 # RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx  -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=NOT_AVX2 --check-prefix=AVX1<br>
 # RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx2 -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=AVX2<br>
@@ -26,7 +27,6 @@<br>
 ...<br>
 ---<br>
 name:            test_add_v32i8<br>
-# ALL-LABEL: name:  test_add_v32i8<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
@@ -34,32 +34,37 @@ registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
   - { id: 2, class: _ }<br>
-# NOT_AVX2:          %0:_(<32 x s8>) = IMPLICIT_DEF<br>
-# NOT_AVX2-NEXT:     %1:_(<32 x s8>) = IMPLICIT_DEF<br>
-# NOT_AVX2-NEXT:     %3:_(<16 x s8>), %4:_(<16 x s8>) = G_UNMERGE_VALUES %0(<32 x s8>)<br>
-# NOT_AVX2-NEXT:     %5:_(<16 x s8>), %6:_(<16 x s8>) = G_UNMERGE_VALUES %1(<32 x s8>)<br>
-# NOT_AVX2-NEXT:     %7:_(<16 x s8>) = G_ADD %3, %5<br>
-# NOT_AVX2-NEXT:     %8:_(<16 x s8>) = G_ADD %4, %6<br>
-# NOT_AVX2-NEXT:     %2:_(<32 x s8>) = G_MERGE_VALUES %7(<16 x s8>), %8(<16 x s8>)<br>
-# NOT_AVX2-NEXT:     RET 0<br>
-#<br>
-# AVX2:              %0:_(<32 x s8>) = IMPLICIT_DEF<br>
-# AVX2-NEXT:         %1:_(<32 x s8>) = IMPLICIT_DEF<br>
-# AVX2-NEXT:         %2:_(<32 x s8>) = G_ADD %0, %1<br>
-# AVX2-NEXT:         RET 0<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %ymm0, %ymm1<br>
<br>
+    ; CHECK-LABEL: name: test_add_v32i8<br>
+    ; ALL: [[DEF:%[0-9]+]]:_(<32 x s8>) = IMPLICIT_DEF<br>
+    ; ALL: [[DEF1:%[0-9]+]]:_(<32 x s8>) = IMPLICIT_DEF<br>
+    ; SSE2: [[UV:%[0-9]+]]:_(<16 x s8>), [[UV1:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[DEF]](<32 x s8>)<br>
+    ; SSE2: [[UV2:%[0-9]+]]:_(<16 x s8>), [[UV3:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[DEF1]](<32 x s8>)<br>
+    ; AVX1: [[UV:%[0-9]+]]:_(<16 x s8>), [[UV1:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[DEF]](<32 x s8>)<br>
+    ; AVX1: [[UV2:%[0-9]+]]:_(<16 x s8>), [[UV3:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[DEF1]](<32 x s8>)<br>
+    ; SSE2: [[ADD:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV]], [[UV2]]<br>
+    ; SSE2: [[ADD1:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV1]], [[UV3]]<br>
+    ; AVX1: [[ADD:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV]], [[UV2]]<br>
+    ; AVX1: [[ADD1:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV1]], [[UV3]]<br>
+    ; SSE2: [[MV:%[0-9]+]]:_(<32 x s8>) = G_MERGE_VALUES [[ADD]](<16 x s8>), [[ADD1]](<16 x s8>)<br>
+    ; AVX1: [[MV:%[0-9]+]]:_(<32 x s8>) = G_MERGE_VALUES [[ADD]](<16 x s8>), [[ADD1]](<16 x s8>)<br>
+    ; SSE2: %ymm0 = COPY [[MV]](<32 x s8>)<br>
+    ; AVX1: %ymm0 = COPY [[MV]](<32 x s8>)<br>
+    ; AVX2: [[ADD:%[0-9]+]]:_(<32 x s8>) = G_ADD [[DEF]], [[DEF1]]<br>
+    ; AVX2: %ymm0 = COPY [[ADD]](<32 x s8>)<br>
+    ; ALL: RET 0<br>
     %0(<32 x s8>) = IMPLICIT_DEF<br>
     %1(<32 x s8>) = IMPLICIT_DEF<br>
     %2(<32 x s8>) = G_ADD %0, %1<br>
+    %ymm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
 ---<br>
 name:            test_add_v16i16<br>
-# ALL-LABEL: name:  test_add_v16i16<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
@@ -67,32 +72,37 @@ registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
   - { id: 2, class: _ }<br>
-# NOT_AVX2:          %0:_(<16 x s16>) = IMPLICIT_DEF<br>
-# NOT_AVX2-NEXT:     %1:_(<16 x s16>) = IMPLICIT_DEF<br>
-# NOT_AVX2-NEXT:     %3:_(<8 x s16>), %4:_(<8 x s16>) = G_UNMERGE_VALUES %0(<16 x s16>)<br>
-# NOT_AVX2-NEXT:     %5:_(<8 x s16>), %6:_(<8 x s16>) = G_UNMERGE_VALUES %1(<16 x s16>)<br>
-# NOT_AVX2-NEXT:     %7:_(<8 x s16>) = G_ADD %3, %5<br>
-# NOT_AVX2-NEXT:     %8:_(<8 x s16>) = G_ADD %4, %6<br>
-# NOT_AVX2-NEXT:     %2:_(<16 x s16>) = G_MERGE_VALUES %7(<8 x s16>), %8(<8 x s16>)<br>
-# NOT_AVX2-NEXT:     RET 0<br>
-#<br>
-# AVX2:              %0:_(<16 x s16>) = IMPLICIT_DEF<br>
-# AVX2-NEXT:         %1:_(<16 x s16>) = IMPLICIT_DEF<br>
-# AVX2-NEXT:         %2:_(<16 x s16>) = G_ADD %0, %1<br>
-# AVX2-NEXT:         RET 0<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %ymm0, %ymm1<br>
<br>
+    ; ALL-LABEL: name: test_add_v16i16<br>
+    ; ALL: [[DEF:%[0-9]+]]:_(<16 x s16>) = IMPLICIT_DEF<br>
+    ; ALL: [[DEF1:%[0-9]+]]:_(<16 x s16>) = IMPLICIT_DEF<br>
+    ; SSE2: [[UV:%[0-9]+]]:_(<8 x s16>), [[UV1:%[0-9]+]]:_(<8 x s16>) = G_UNMERGE_VALUES [[DEF]](<16 x s16>)<br>
+    ; SSE2: [[UV2:%[0-9]+]]:_(<8 x s16>), [[UV3:%[0-9]+]]:_(<8 x s16>) = G_UNMERGE_VALUES [[DEF1]](<16 x s16>)<br>
+    ; SSE2: [[ADD:%[0-9]+]]:_(<8 x s16>) = G_ADD [[UV]], [[UV2]]<br>
+    ; SSE2: [[ADD1:%[0-9]+]]:_(<8 x s16>) = G_ADD [[UV1]], [[UV3]]<br>
+    ; SSE2: [[MV:%[0-9]+]]:_(<16 x s16>) = G_MERGE_VALUES [[ADD]](<8 x s16>), [[ADD1]](<8 x s16>)<br>
+    ; AVX1: [[UV:%[0-9]+]]:_(<8 x s16>), [[UV1:%[0-9]+]]:_(<8 x s16>) = G_UNMERGE_VALUES [[DEF]](<16 x s16>)<br>
+    ; AVX1: [[UV2:%[0-9]+]]:_(<8 x s16>), [[UV3:%[0-9]+]]:_(<8 x s16>) = G_UNMERGE_VALUES [[DEF1]](<16 x s16>)<br>
+    ; AVX1: [[ADD:%[0-9]+]]:_(<8 x s16>) = G_ADD [[UV]], [[UV2]]<br>
+    ; AVX1: [[ADD1:%[0-9]+]]:_(<8 x s16>) = G_ADD [[UV1]], [[UV3]]<br>
+    ; AVX1: [[MV:%[0-9]+]]:_(<16 x s16>) = G_MERGE_VALUES [[ADD]](<8 x s16>), [[ADD1]](<8 x s16>)<br>
+    ; SSE2: %ymm0 = COPY [[MV]](<16 x s16>)<br>
+    ; AVX1: %ymm0 = COPY [[MV]](<16 x s16>)<br>
+    ; AVX2: [[ADD:%[0-9]+]]:_(<16 x s16>) = G_ADD [[DEF]], [[DEF1]]<br>
+    ; AVX2: %ymm0 = COPY [[ADD]](<16 x s16>)<br>
+    ; ALL: RET 0<br>
     %0(<16 x s16>) = IMPLICIT_DEF<br>
     %1(<16 x s16>) = IMPLICIT_DEF<br>
     %2(<16 x s16>) = G_ADD %0, %1<br>
+    %ymm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
 ---<br>
 name:            test_add_v8i32<br>
-# ALL-LABEL: name:  test_add_v8i32<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
@@ -100,32 +110,37 @@ registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
   - { id: 2, class: _ }<br>
-# NOT_AVX2:          %0:_(<8 x s32>) = IMPLICIT_DEF<br>
-# NOT_AVX2-NEXT:     %1:_(<8 x s32>) = IMPLICIT_DEF<br>
-# NOT_AVX2-NEXT:     %3:_(<4 x s32>), %4:_(<4 x s32>) = G_UNMERGE_VALUES %0(<8 x s32>)<br>
-# NOT_AVX2-NEXT:     %5:_(<4 x s32>), %6:_(<4 x s32>) = G_UNMERGE_VALUES %1(<8 x s32>)<br>
-# NOT_AVX2-NEXT:     %7:_(<4 x s32>) = G_ADD %3, %5<br>
-# NOT_AVX2-NEXT:     %8:_(<4 x s32>) = G_ADD %4, %6<br>
-# NOT_AVX2-NEXT:     %2:_(<8 x s32>) = G_MERGE_VALUES %7(<4 x s32>), %8(<4 x s32>)<br>
-# NOT_AVX2-NEXT:     RET 0<br>
-#<br>
-# AVX2:              %0:_(<8 x s32>) = IMPLICIT_DEF<br>
-# AVX2-NEXT:         %1:_(<8 x s32>) = IMPLICIT_DEF<br>
-# AVX2-NEXT:         %2:_(<8 x s32>) = G_ADD %0, %1<br>
-# AVX2-NEXT:         RET 0<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %ymm0, %ymm1<br>
<br>
+    ; ALL-LABEL: name: test_add_v8i32<br>
+    ; ALL: [[DEF:%[0-9]+]]:_(<8 x s32>) = IMPLICIT_DEF<br>
+    ; ALL: [[DEF1:%[0-9]+]]:_(<8 x s32>) = IMPLICIT_DEF<br>
+    ; SSE2: [[UV:%[0-9]+]]:_(<4 x s32>), [[UV1:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[DEF]](<8 x s32>)<br>
+    ; SSE2: [[UV2:%[0-9]+]]:_(<4 x s32>), [[UV3:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[DEF1]](<8 x s32>)<br>
+    ; SSE2: [[ADD:%[0-9]+]]:_(<4 x s32>) = G_ADD [[UV]], [[UV2]]<br>
+    ; SSE2: [[ADD1:%[0-9]+]]:_(<4 x s32>) = G_ADD [[UV1]], [[UV3]]<br>
+    ; SSE2: [[MV:%[0-9]+]]:_(<8 x s32>) = G_MERGE_VALUES [[ADD]](<4 x s32>), [[ADD1]](<4 x s32>)<br>
+    ; SSE2: %ymm0 = COPY [[MV]](<8 x s32>)<br>
+    ; AVX1: [[UV:%[0-9]+]]:_(<4 x s32>), [[UV1:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[DEF]](<8 x s32>)<br>
+    ; AVX1: [[UV2:%[0-9]+]]:_(<4 x s32>), [[UV3:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[DEF1]](<8 x s32>)<br>
+    ; AVX1: [[ADD:%[0-9]+]]:_(<4 x s32>) = G_ADD [[UV]], [[UV2]]<br>
+    ; AVX1: [[ADD1:%[0-9]+]]:_(<4 x s32>) = G_ADD [[UV1]], [[UV3]]<br>
+    ; AVX1: [[MV:%[0-9]+]]:_(<8 x s32>) = G_MERGE_VALUES [[ADD]](<4 x s32>), [[ADD1]](<4 x s32>)<br>
+    ; AVX1: %ymm0 = COPY [[MV]](<8 x s32>)<br>
+    ; AVX2: [[ADD:%[0-9]+]]:_(<8 x s32>) = G_ADD [[DEF]], [[DEF1]]<br>
+    ; AVX2: %ymm0 = COPY [[ADD]](<8 x s32>)<br>
+    ; ALL: RET 0<br>
     %0(<8 x s32>) = IMPLICIT_DEF<br>
     %1(<8 x s32>) = IMPLICIT_DEF<br>
     %2(<8 x s32>) = G_ADD %0, %1<br>
+    %ymm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
 ---<br>
 name:            test_add_v4i64<br>
-# ALL-LABEL: name:  test_add_v4i64<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
@@ -133,26 +148,32 @@ registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
   - { id: 2, class: _ }<br>
-# NOT_AVX2:          %0:_(<4 x s64>) = IMPLICIT_DEF<br>
-# NOT_AVX2-NEXT:     %1:_(<4 x s64>) = IMPLICIT_DEF<br>
-# NOT_AVX2-NEXT:     %3:_(<2 x s64>), %4:_(<2 x s64>) = G_UNMERGE_VALUES %0(<4 x s64>)<br>
-# NOT_AVX2-NEXT:     %5:_(<2 x s64>), %6:_(<2 x s64>) = G_UNMERGE_VALUES %1(<4 x s64>)<br>
-# NOT_AVX2-NEXT:     %7:_(<2 x s64>) = G_ADD %3, %5<br>
-# NOT_AVX2-NEXT:     %8:_(<2 x s64>) = G_ADD %4, %6<br>
-# NOT_AVX2-NEXT:     %2:_(<4 x s64>) = G_MERGE_VALUES %7(<2 x s64>), %8(<2 x s64>)<br>
-# NOT_AVX2-NEXT:     RET 0<br>
-#<br>
-# AVX2:              %0:_(<4 x s64>) = IMPLICIT_DEF<br>
-# AVX2-NEXT:         %1:_(<4 x s64>) = IMPLICIT_DEF<br>
-# AVX2-NEXT:         %2:_(<4 x s64>) = G_ADD %0, %1<br>
-# AVX2-NEXT:         RET 0<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %ymm0, %ymm1<br>
<br>
+    ; ALL-LABEL: name: test_add_v4i64<br>
+    ; ALL: [[DEF:%[0-9]+]]:_(<4 x s64>) = IMPLICIT_DEF<br>
+    ; ALL: [[DEF1:%[0-9]+]]:_(<4 x s64>) = IMPLICIT_DEF<br>
+    ; SSE2: [[UV:%[0-9]+]]:_(<2 x s64>), [[UV1:%[0-9]+]]:_(<2 x s64>) = G_UNMERGE_VALUES [[DEF]](<4 x s64>)<br>
+    ; SSE2: [[UV2:%[0-9]+]]:_(<2 x s64>), [[UV3:%[0-9]+]]:_(<2 x s64>) = G_UNMERGE_VALUES [[DEF1]](<4 x s64>)<br>
+    ; SSE2: [[ADD:%[0-9]+]]:_(<2 x s64>) = G_ADD [[UV]], [[UV2]]<br>
+    ; SSE2: [[ADD1:%[0-9]+]]:_(<2 x s64>) = G_ADD [[UV1]], [[UV3]]<br>
+    ; SSE2: [[MV:%[0-9]+]]:_(<4 x s64>) = G_MERGE_VALUES [[ADD]](<2 x s64>), [[ADD1]](<2 x s64>)<br>
+    ; AVX1: [[UV:%[0-9]+]]:_(<2 x s64>), [[UV1:%[0-9]+]]:_(<2 x s64>) = G_UNMERGE_VALUES [[DEF]](<4 x s64>)<br>
+    ; AVX1: [[UV2:%[0-9]+]]:_(<2 x s64>), [[UV3:%[0-9]+]]:_(<2 x s64>) = G_UNMERGE_VALUES [[DEF1]](<4 x s64>)<br>
+    ; AVX1: [[ADD:%[0-9]+]]:_(<2 x s64>) = G_ADD [[UV]], [[UV2]]<br>
+    ; AVX1: [[ADD1:%[0-9]+]]:_(<2 x s64>) = G_ADD [[UV1]], [[UV3]]<br>
+    ; AVX1: [[MV:%[0-9]+]]:_(<4 x s64>) = G_MERGE_VALUES [[ADD]](<2 x s64>), [[ADD1]](<2 x s64>)<br>
+    ; SSE2: %ymm0 = COPY [[MV]](<4 x s64>)<br>
+    ; AVX1: %ymm0 = COPY [[MV]](<4 x s64>)<br>
+    ; AVX2: [[ADD:%[0-9]+]]:_(<4 x s64>) = G_ADD [[DEF]], [[DEF1]]<br>
+    ; AVX2: %ymm0 = COPY [[ADD]](<4 x s64>)<br>
+    ; ALL: RET 0<br>
     %0(<4 x s64>) = IMPLICIT_DEF<br>
     %1(<4 x s64>) = IMPLICIT_DEF<br>
     %2(<4 x s64>) = G_ADD %0, %1<br>
+    %ymm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-add-v512.<wbr>mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-add-v512.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-add-v512.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-add-v512.<wbr>mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-add-v512.<wbr>mir Tue Nov 14 14:42:19 2017<br>
@@ -1,3 +1,4 @@<br>
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
 # RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx               -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=AVX1<br>
 # RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx512f           -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=AVX512F<br>
 # RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx512f,+avx512bw -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=AVX512BW<br>
@@ -30,7 +31,6 @@<br>
 ...<br>
 ---<br>
 name:            test_add_v64i8<br>
-# ALL-LABEL: name:  test_add_v64i8<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
@@ -38,43 +38,39 @@ registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
   - { id: 2, class: _ }<br>
-# AVX1:              %0:_(<64 x s8>) = IMPLICIT_DEF<br>
-# AVX1-NEXT:         %1:_(<64 x s8>) = IMPLICIT_DEF<br>
-# AVX1-NEXT:         %3:_(<16 x s8>), %4:_(<16 x s8>), %5:_(<16 x s8>), %6:_(<16 x s8>) = G_UNMERGE_VALUES %0(<64 x s8>)<br>
-# AVX1-NEXT:         %7:_(<16 x s8>), %8:_(<16 x s8>), %9:_(<16 x s8>), %10:_(<16 x s8>) = G_UNMERGE_VALUES %1(<64 x s8>)<br>
-# AVX1-NEXT:         %11:_(<16 x s8>) = G_ADD %3, %7<br>
-# AVX1-NEXT:         %12:_(<16 x s8>) = G_ADD %4, %8<br>
-# AVX1-NEXT:         %13:_(<16 x s8>) = G_ADD %5, %9<br>
-# AVX1-NEXT:         %14:_(<16 x s8>) = G_ADD %6, %10<br>
-# AVX1-NEXT:         %2:_(<64 x s8>) = G_MERGE_VALUES %11(<16 x s8>), %12(<16 x s8>), %13(<16 x s8>), %14(<16 x s8>)<br>
-# AVX1-NEXT:         RET 0<br>
-#<br>
-# AVX512F:           %0:_(<64 x s8>) = IMPLICIT_DEF<br>
-# AVX512F-NEXT:      %1:_(<64 x s8>) = IMPLICIT_DEF<br>
-# AVX512F-NEXT:      %3:_(<32 x s8>), %4:_(<32 x s8>) = G_UNMERGE_VALUES %0(<64 x s8>)<br>
-# AVX512F-NEXT:      %5:_(<32 x s8>), %6:_(<32 x s8>) = G_UNMERGE_VALUES %1(<64 x s8>)<br>
-# AVX512F-NEXT:      %7:_(<32 x s8>) = G_ADD %3, %5<br>
-# AVX512F-NEXT:      %8:_(<32 x s8>) = G_ADD %4, %6<br>
-# AVX512F-NEXT:      %2:_(<64 x s8>) = G_MERGE_VALUES %7(<32 x s8>), %8(<32 x s8>)<br>
-# AVX512F-NEXT:      RET 0<br>
-#<br>
-# AVX512BW:          %0:_(<64 x s8>) = IMPLICIT_DEF<br>
-# AVX512BW-NEXT:     %1:_(<64 x s8>) = IMPLICIT_DEF<br>
-# AVX512BW-NEXT:     %2:_(<64 x s8>) = G_ADD %0, %1<br>
-# AVX512BW-NEXT:     RET 0<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %zmm0, %zmm1<br>
<br>
+    ; ALL-LABEL: name: test_add_v64i8<br>
+    ; ALL: [[DEF:%[0-9]+]]:_(<64 x s8>) = IMPLICIT_DEF<br>
+    ; ALL: [[DEF1:%[0-9]+]]:_(<64 x s8>) = IMPLICIT_DEF<br>
+    ; AVX1: [[UV:%[0-9]+]]:_(<16 x s8>), [[UV1:%[0-9]+]]:_(<16 x s8>), [[UV2:%[0-9]+]]:_(<16 x s8>), [[UV3:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[DEF]](<64 x s8>)<br>
+    ; AVX1: [[UV4:%[0-9]+]]:_(<16 x s8>), [[UV5:%[0-9]+]]:_(<16 x s8>), [[UV6:%[0-9]+]]:_(<16 x s8>), [[UV7:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[DEF1]](<64 x s8>)<br>
+    ; AVX1: [[ADD:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV]], [[UV4]]<br>
+    ; AVX1: [[ADD1:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV1]], [[UV5]]<br>
+    ; AVX1: [[ADD2:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV2]], [[UV6]]<br>
+    ; AVX1: [[ADD3:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV3]], [[UV7]]<br>
+    ; AVX1: [[MV:%[0-9]+]]:_(<64 x s8>) = G_MERGE_VALUES [[ADD]](<16 x s8>), [[ADD1]](<16 x s8>), [[ADD2]](<16 x s8>), [[ADD3]](<16 x s8>)<br>
+    ; AVX1: %zmm0 = COPY [[MV]](<64 x s8>)<br>
+    ; AVX512F: [[UV:%[0-9]+]]:_(<32 x s8>), [[UV1:%[0-9]+]]:_(<32 x s8>) = G_UNMERGE_VALUES [[DEF]](<64 x s8>)<br>
+    ; AVX512F: [[UV2:%[0-9]+]]:_(<32 x s8>), [[UV3:%[0-9]+]]:_(<32 x s8>) = G_UNMERGE_VALUES [[DEF1]](<64 x s8>)<br>
+    ; AVX512F: [[ADD:%[0-9]+]]:_(<32 x s8>) = G_ADD [[UV]], [[UV2]]<br>
+    ; AVX512F: [[ADD1:%[0-9]+]]:_(<32 x s8>) = G_ADD [[UV1]], [[UV3]]<br>
+    ; AVX512F: [[MV:%[0-9]+]]:_(<64 x s8>) = G_MERGE_VALUES [[ADD]](<32 x s8>), [[ADD1]](<32 x s8>)<br>
+    ; AVX512F: %zmm0 = COPY [[MV]](<64 x s8>)<br>
+    ; AVX512BW: [[ADD:%[0-9]+]]:_(<64 x s8>) = G_ADD [[DEF]], [[DEF1]]<br>
+    ; AVX512BW: %zmm0 = COPY [[ADD]](<64 x s8>)<br>
+    ; ALL: RET 0<br>
     %0(<64 x s8>) = IMPLICIT_DEF<br>
     %1(<64 x s8>) = IMPLICIT_DEF<br>
     %2(<64 x s8>) = G_ADD %0, %1<br>
+    %zmm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
 ---<br>
 name:            test_add_v32i16<br>
-# ALL-LABEL: name:  test_add_v32i16<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
@@ -82,43 +78,39 @@ registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
   - { id: 2, class: _ }<br>
-# AVX1:              %0:_(<32 x s16>) = IMPLICIT_DEF<br>
-# AVX1-NEXT:         %1:_(<32 x s16>) = IMPLICIT_DEF<br>
-# AVX1-NEXT:         %3:_(<8 x s16>), %4:_(<8 x s16>), %5:_(<8 x s16>), %6:_(<8 x s16>) = G_UNMERGE_VALUES %0(<32 x s16>)<br>
-# AVX1-NEXT:         %7:_(<8 x s16>), %8:_(<8 x s16>), %9:_(<8 x s16>), %10:_(<8 x s16>) = G_UNMERGE_VALUES %1(<32 x s16>)<br>
-# AVX1-NEXT:         %11:_(<8 x s16>) = G_ADD %3, %7<br>
-# AVX1-NEXT:         %12:_(<8 x s16>) = G_ADD %4, %8<br>
-# AVX1-NEXT:         %13:_(<8 x s16>) = G_ADD %5, %9<br>
-# AVX1-NEXT:         %14:_(<8 x s16>) = G_ADD %6, %10<br>
-# AVX1-NEXT:         %2:_(<32 x s16>) = G_MERGE_VALUES %11(<8 x s16>), %12(<8 x s16>), %13(<8 x s16>), %14(<8 x s16>)<br>
-# AVX1-NEXT:         RET 0<br>
-#<br>
-# AVX512F:           %0:_(<32 x s16>) = IMPLICIT_DEF<br>
-# AVX512F-NEXT:      %1:_(<32 x s16>) = IMPLICIT_DEF<br>
-# AVX512F-NEXT:      %3:_(<16 x s16>), %4:_(<16 x s16>) = G_UNMERGE_VALUES %0(<32 x s16>)<br>
-# AVX512F-NEXT:      %5:_(<16 x s16>), %6:_(<16 x s16>) = G_UNMERGE_VALUES %1(<32 x s16>)<br>
-# AVX512F-NEXT:      %7:_(<16 x s16>) = G_ADD %3, %5<br>
-# AVX512F-NEXT:      %8:_(<16 x s16>) = G_ADD %4, %6<br>
-# AVX512F-NEXT:      %2:_(<32 x s16>) = G_MERGE_VALUES %7(<16 x s16>), %8(<16 x s16>)<br>
-# AVX512F-NEXT:      RET 0<br>
-#<br>
-# AVX512BW:          %0:_(<32 x s16>) = IMPLICIT_DEF<br>
-# AVX512BW-NEXT:     %1:_(<32 x s16>) = IMPLICIT_DEF<br>
-# AVX512BW-NEXT:     %2:_(<32 x s16>) = G_ADD %0, %1<br>
-# AVX512BW-NEXT:     RET 0<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %zmm0, %zmm1<br>
<br>
+    ; ALL-LABEL: name: test_add_v32i16<br>
+    ; ALL: [[DEF:%[0-9]+]]:_(<32 x s16>) = IMPLICIT_DEF<br>
+    ; ALL: [[DEF1:%[0-9]+]]:_(<32 x s16>) = IMPLICIT_DEF<br>
+    ; AVX1: [[UV:%[0-9]+]]:_(<8 x s16>), [[UV1:%[0-9]+]]:_(<8 x s16>), [[UV2:%[0-9]+]]:_(<8 x s16>), [[UV3:%[0-9]+]]:_(<8 x s16>) = G_UNMERGE_VALUES [[DEF]](<32 x s16>)<br>
+    ; AVX1: [[UV4:%[0-9]+]]:_(<8 x s16>), [[UV5:%[0-9]+]]:_(<8 x s16>), [[UV6:%[0-9]+]]:_(<8 x s16>), [[UV7:%[0-9]+]]:_(<8 x s16>) = G_UNMERGE_VALUES [[DEF1]](<32 x s16>)<br>
+    ; AVX1: [[ADD:%[0-9]+]]:_(<8 x s16>) = G_ADD [[UV]], [[UV4]]<br>
+    ; AVX1: [[ADD1:%[0-9]+]]:_(<8 x s16>) = G_ADD [[UV1]], [[UV5]]<br>
+    ; AVX1: [[ADD2:%[0-9]+]]:_(<8 x s16>) = G_ADD [[UV2]], [[UV6]]<br>
+    ; AVX1: [[ADD3:%[0-9]+]]:_(<8 x s16>) = G_ADD [[UV3]], [[UV7]]<br>
+    ; AVX1: [[MV:%[0-9]+]]:_(<32 x s16>) = G_MERGE_VALUES [[ADD]](<8 x s16>), [[ADD1]](<8 x s16>), [[ADD2]](<8 x s16>), [[ADD3]](<8 x s16>)<br>
+    ; AVX1: %zmm0 = COPY [[MV]](<32 x s16>)<br>
+    ; AVX512F: [[UV:%[0-9]+]]:_(<16 x s16>), [[UV1:%[0-9]+]]:_(<16 x s16>) = G_UNMERGE_VALUES [[DEF]](<32 x s16>)<br>
+    ; AVX512F: [[UV2:%[0-9]+]]:_(<16 x s16>), [[UV3:%[0-9]+]]:_(<16 x s16>) = G_UNMERGE_VALUES [[DEF1]](<32 x s16>)<br>
+    ; AVX512F: [[ADD:%[0-9]+]]:_(<16 x s16>) = G_ADD [[UV]], [[UV2]]<br>
+    ; AVX512F: [[ADD1:%[0-9]+]]:_(<16 x s16>) = G_ADD [[UV1]], [[UV3]]<br>
+    ; AVX512F: [[MV:%[0-9]+]]:_(<32 x s16>) = G_MERGE_VALUES [[ADD]](<16 x s16>), [[ADD1]](<16 x s16>)<br>
+    ; AVX512F: %zmm0 = COPY [[MV]](<32 x s16>)<br>
+    ; AVX512BW: [[ADD:%[0-9]+]]:_(<32 x s16>) = G_ADD [[DEF]], [[DEF1]]<br>
+    ; AVX512BW: %zmm0 = COPY [[ADD]](<32 x s16>)<br>
+    ; ALL: RET 0<br>
     %0(<32 x s16>) = IMPLICIT_DEF<br>
     %1(<32 x s16>) = IMPLICIT_DEF<br>
     %2(<32 x s16>) = G_ADD %0, %1<br>
+    %zmm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
 ---<br>
 name:            test_add_v16i32<br>
-# ALL-LABEL: name:  test_add_v16i32<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
@@ -126,39 +118,35 @@ registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
   - { id: 2, class: _ }<br>
-# AVX1:              %0:_(<16 x s32>) = IMPLICIT_DEF<br>
-# AVX1-NEXT:         %1:_(<16 x s32>) = IMPLICIT_DEF<br>
-# AVX1-NEXT:         %3:_(<4 x s32>), %4:_(<4 x s32>), %5:_(<4 x s32>), %6:_(<4 x s32>) = G_UNMERGE_VALUES %0(<16 x s32>)<br>
-# AVX1-NEXT:         %7:_(<4 x s32>), %8:_(<4 x s32>), %9:_(<4 x s32>), %10:_(<4 x s32>) = G_UNMERGE_VALUES %1(<16 x s32>)<br>
-# AVX1-NEXT:         %11:_(<4 x s32>) = G_ADD %3, %7<br>
-# AVX1-NEXT:         %12:_(<4 x s32>) = G_ADD %4, %8<br>
-# AVX1-NEXT:         %13:_(<4 x s32>) = G_ADD %5, %9<br>
-# AVX1-NEXT:         %14:_(<4 x s32>) = G_ADD %6, %10<br>
-# AVX1-NEXT:         %2:_(<16 x s32>) = G_MERGE_VALUES %11(<4 x s32>), %12(<4 x s32>), %13(<4 x s32>), %14(<4 x s32>)<br>
-# AVX1-NEXT:         RET 0<br>
-#<br>
-# AVX512F:           %0:_(<16 x s32>) = IMPLICIT_DEF<br>
-# AVX512F-NEXT:      %1:_(<16 x s32>) = IMPLICIT_DEF<br>
-# AVX512F-NEXT:      %2:_(<16 x s32>) = G_ADD %0, %1<br>
-# AVX512F-NEXT:      RET 0<br>
-#<br>
-# AVX512BW:          %0:_(<16 x s32>) = IMPLICIT_DEF<br>
-# AVX512BW-NEXT:     %1:_(<16 x s32>) = IMPLICIT_DEF<br>
-# AVX512BW-NEXT:     %2:_(<16 x s32>) = G_ADD %0, %1<br>
-# AVX512BW-NEXT:     RET 0<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %zmm0, %zmm1<br>
<br>
+    ; ALL-LABEL: name: test_add_v16i32<br>
+    ; ALL: [[DEF:%[0-9]+]]:_(<16 x s32>) = IMPLICIT_DEF<br>
+    ; ALL: [[DEF1:%[0-9]+]]:_(<16 x s32>) = IMPLICIT_DEF<br>
+    ; AVX1: [[UV:%[0-9]+]]:_(<4 x s32>), [[UV1:%[0-9]+]]:_(<4 x s32>), [[UV2:%[0-9]+]]:_(<4 x s32>), [[UV3:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[DEF]](<16 x s32>)<br>
+    ; AVX1: [[UV4:%[0-9]+]]:_(<4 x s32>), [[UV5:%[0-9]+]]:_(<4 x s32>), [[UV6:%[0-9]+]]:_(<4 x s32>), [[UV7:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[DEF1]](<16 x s32>)<br>
+    ; AVX1: [[ADD:%[0-9]+]]:_(<4 x s32>) = G_ADD [[UV]], [[UV4]]<br>
+    ; AVX1: [[ADD1:%[0-9]+]]:_(<4 x s32>) = G_ADD [[UV1]], [[UV5]]<br>
+    ; AVX1: [[ADD2:%[0-9]+]]:_(<4 x s32>) = G_ADD [[UV2]], [[UV6]]<br>
+    ; AVX1: [[ADD3:%[0-9]+]]:_(<4 x s32>) = G_ADD [[UV3]], [[UV7]]<br>
+    ; AVX1: [[MV:%[0-9]+]]:_(<16 x s32>) = G_MERGE_VALUES [[ADD]](<4 x s32>), [[ADD1]](<4 x s32>), [[ADD2]](<4 x s32>), [[ADD3]](<4 x s32>)<br>
+    ; AVX1: %zmm0 = COPY [[MV]](<16 x s32>)<br>
+    ; AVX512F: [[ADD:%[0-9]+]]:_(<16 x s32>) = G_ADD [[DEF]], [[DEF1]]<br>
+    ; AVX512F: %zmm0 = COPY [[ADD]](<16 x s32>)<br>
+    ; AVX512BW: [[ADD:%[0-9]+]]:_(<16 x s32>) = G_ADD [[DEF]], [[DEF1]]<br>
+    ; AVX512BW: %zmm0 = COPY [[ADD]](<16 x s32>)<br>
+    ; ALL: RET 0<br>
     %0(<16 x s32>) = IMPLICIT_DEF<br>
     %1(<16 x s32>) = IMPLICIT_DEF<br>
     %2(<16 x s32>) = G_ADD %0, %1<br>
+    %zmm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
 ---<br>
 name:            test_add_v8i64<br>
-# ALL-LABEL: name:  test_add_v8i64<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
@@ -166,39 +154,35 @@ registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
   - { id: 2, class: _ }<br>
-# AVX1:              %0:_(<8 x s64>) = IMPLICIT_DEF<br>
-# AVX1-NEXT:         %1:_(<8 x s64>) = IMPLICIT_DEF<br>
-# AVX1-NEXT:         %3:_(<2 x s64>), %4:_(<2 x s64>), %5:_(<2 x s64>), %6:_(<2 x s64>) = G_UNMERGE_VALUES %0(<8 x s64>)<br>
-# AVX1-NEXT:         %7:_(<2 x s64>), %8:_(<2 x s64>), %9:_(<2 x s64>), %10:_(<2 x s64>) = G_UNMERGE_VALUES %1(<8 x s64>)<br>
-# AVX1-NEXT:         %11:_(<2 x s64>) = G_ADD %3, %7<br>
-# AVX1-NEXT:         %12:_(<2 x s64>) = G_ADD %4, %8<br>
-# AVX1-NEXT:         %13:_(<2 x s64>) = G_ADD %5, %9<br>
-# AVX1-NEXT:         %14:_(<2 x s64>) = G_ADD %6, %10<br>
-# AVX1-NEXT:         %2:_(<8 x s64>) = G_MERGE_VALUES %11(<2 x s64>), %12(<2 x s64>), %13(<2 x s64>), %14(<2 x s64>)<br>
-# AVX1-NEXT:         RET 0<br>
-#<br>
-# AVX512F:           %0:_(<8 x s64>) = IMPLICIT_DEF<br>
-# AVX512F-NEXT:      %1:_(<8 x s64>) = IMPLICIT_DEF<br>
-# AVX512F-NEXT:      %2:_(<8 x s64>) = G_ADD %0, %1<br>
-# AVX512F-NEXT:      RET 0<br>
-#<br>
-# AVX512BW:          %0:_(<8 x s64>) = IMPLICIT_DEF<br>
-# AVX512BW-NEXT:     %1:_(<8 x s64>) = IMPLICIT_DEF<br>
-# AVX512BW-NEXT:     %2:_(<8 x s64>) = G_ADD %0, %1<br>
-# AVX512BW-NEXT:     RET 0<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %zmm0, %zmm1<br>
<br>
+    ; ALL-LABEL: name: test_add_v8i64<br>
+    ; ALL: [[DEF:%[0-9]+]]:_(<8 x s64>) = IMPLICIT_DEF<br>
+    ; ALL: [[DEF1:%[0-9]+]]:_(<8 x s64>) = IMPLICIT_DEF<br>
+    ; AVX1: [[UV:%[0-9]+]]:_(<2 x s64>), [[UV1:%[0-9]+]]:_(<2 x s64>), [[UV2:%[0-9]+]]:_(<2 x s64>), [[UV3:%[0-9]+]]:_(<2 x s64>) = G_UNMERGE_VALUES [[DEF]](<8 x s64>)<br>
+    ; AVX1: [[UV4:%[0-9]+]]:_(<2 x s64>), [[UV5:%[0-9]+]]:_(<2 x s64>), [[UV6:%[0-9]+]]:_(<2 x s64>), [[UV7:%[0-9]+]]:_(<2 x s64>) = G_UNMERGE_VALUES [[DEF1]](<8 x s64>)<br>
+    ; AVX1: [[ADD:%[0-9]+]]:_(<2 x s64>) = G_ADD [[UV]], [[UV4]]<br>
+    ; AVX1: [[ADD1:%[0-9]+]]:_(<2 x s64>) = G_ADD [[UV1]], [[UV5]]<br>
+    ; AVX1: [[ADD2:%[0-9]+]]:_(<2 x s64>) = G_ADD [[UV2]], [[UV6]]<br>
+    ; AVX1: [[ADD3:%[0-9]+]]:_(<2 x s64>) = G_ADD [[UV3]], [[UV7]]<br>
+    ; AVX1: [[MV:%[0-9]+]]:_(<8 x s64>) = G_MERGE_VALUES [[ADD]](<2 x s64>), [[ADD1]](<2 x s64>), [[ADD2]](<2 x s64>), [[ADD3]](<2 x s64>)<br>
+    ; AVX1: %zmm0 = COPY [[MV]](<8 x s64>)<br>
+    ; AVX512F: [[ADD:%[0-9]+]]:_(<8 x s64>) = G_ADD [[DEF]], [[DEF1]]<br>
+    ; AVX512F: %zmm0 = COPY [[ADD]](<8 x s64>)<br>
+    ; AVX512BW: [[ADD:%[0-9]+]]:_(<8 x s64>) = G_ADD [[DEF]], [[DEF1]]<br>
+    ; AVX512BW: %zmm0 = COPY [[ADD]](<8 x s64>)<br>
+    ; ALL: RET 0<br>
     %0(<8 x s64>) = IMPLICIT_DEF<br>
     %1(<8 x s64>) = IMPLICIT_DEF<br>
     %2(<8 x s64>) = G_ADD %0, %1<br>
+    %zmm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
 ---<br>
 name:            test_add_v64i8_2<br>
-# ALL-LABEL: name:  test_add_v64i8_2<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
@@ -212,49 +196,40 @@ registers:<br>
   - { id: 6, class: _ }<br>
   - { id: 7, class: _ }<br>
   - { id: 8, class: _ }<br>
-# AVX1:              %2:_(<32 x s8>) = COPY %ymm0<br>
-# AVX1-NEXT:         %3:_(<32 x s8>) = COPY %ymm1<br>
-# AVX1-NEXT:         %4:_(<32 x s8>) = COPY %ymm2<br>
-# AVX1-NEXT:         %5:_(<32 x s8>) = COPY %ymm3<br>
-# AVX1-NEXT:         %9:_(<16 x s8>), %10:_(<16 x s8>) = G_UNMERGE_VALUES %2(<32 x s8>)<br>
-# AVX1-NEXT:         %11:_(<16 x s8>), %12:_(<16 x s8>) = G_UNMERGE_VALUES %3(<32 x s8>)<br>
-# AVX1-NEXT:         %13:_(<16 x s8>), %14:_(<16 x s8>) = G_UNMERGE_VALUES %4(<32 x s8>)<br>
-# AVX1-NEXT:         %15:_(<16 x s8>), %16:_(<16 x s8>) = G_UNMERGE_VALUES %5(<32 x s8>)<br>
-# AVX1-NEXT:         %17:_(<16 x s8>) = G_ADD %9, %13<br>
-# AVX1-NEXT:         %18:_(<16 x s8>) = G_ADD %10, %14<br>
-# AVX1-NEXT:         %19:_(<16 x s8>) = G_ADD %11, %15<br>
-# AVX1-NEXT:         %20:_(<16 x s8>) = G_ADD %12, %16<br>
-# AVX1-NEXT:         %7:_(<32 x s8>) = G_MERGE_VALUES %17(<16 x s8>), %18(<16 x s8>)<br>
-# AVX1-NEXT:         %8:_(<32 x s8>) = G_MERGE_VALUES %19(<16 x s8>), %20(<16 x s8>)<br>
-# AVX1-NEXT:         %ymm0 = COPY %7(<32 x s8>)<br>
-# AVX1-NEXT:         %ymm1 = COPY %8(<32 x s8>)<br>
-# AVX1-NEXT:         RET 0, implicit %ymm0, implicit %ymm1<br>
 #<br>
-# AVX512F:           %2:_(<32 x s8>) = COPY %ymm0<br>
-# AVX512F-NEXT:      %3:_(<32 x s8>) = COPY %ymm1<br>
-# AVX512F-NEXT:      %4:_(<32 x s8>) = COPY %ymm2<br>
-# AVX512F-NEXT:      %5:_(<32 x s8>) = COPY %ymm3<br>
-# AVX512F-NEXT:      %13:_(<32 x s8>) = G_ADD %2, %4<br>
-# AVX512F-NEXT:      %14:_(<32 x s8>) = G_ADD %3, %5<br>
-# AVX512F-NEXT:      %ymm0 = COPY %13(<32 x s8>)<br>
-# AVX512F-NEXT:      %ymm1 = COPY %14(<32 x s8>)<br>
-# AVX512F-NEXT:      RET 0, implicit %ymm0, implicit %ymm1<br>
 #<br>
-# AVX512BW:          %2:_(<32 x s8>) = COPY %ymm0<br>
-# AVX512BW-NEXT:     %3:_(<32 x s8>) = COPY %ymm1<br>
-# AVX512BW-NEXT:     %4:_(<32 x s8>) = COPY %ymm2<br>
-# AVX512BW-NEXT:     %5:_(<32 x s8>) = COPY %ymm3<br>
-# AVX512BW-NEXT:     %0:_(<64 x s8>) = G_MERGE_VALUES %2(<32 x s8>), %3(<32 x s8>)<br>
-# AVX512BW-NEXT:     %1:_(<64 x s8>) = G_MERGE_VALUES %4(<32 x s8>), %5(<32 x s8>)<br>
-# AVX512BW-NEXT:     %6:_(<64 x s8>) = G_ADD %0, %1<br>
-# AVX512BW-NEXT:     %7:_(<32 x s8>), %8:_(<32 x s8>) = G_UNMERGE_VALUES %6(<64 x s8>)<br>
-# AVX512BW-NEXT:     %ymm0 = COPY %7(<32 x s8>)<br>
-# AVX512BW-NEXT:     %ymm1 = COPY %8(<32 x s8>)<br>
-# AVX512BW-NEXT:     RET 0, implicit %ymm0, implicit %ymm1<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %ymm0, %ymm1, %ymm2, %ymm3<br>
<br>
+    ; ALL-LABEL: name: test_add_v64i8_2<br>
+    ; ALL: [[COPY:%[0-9]+]]:_(<32 x s8>) = COPY %ymm0<br>
+    ; ALL: [[COPY1:%[0-9]+]]:_(<32 x s8>) = COPY %ymm1<br>
+    ; ALL: [[COPY2:%[0-9]+]]:_(<32 x s8>) = COPY %ymm2<br>
+    ; ALL: [[COPY3:%[0-9]+]]:_(<32 x s8>) = COPY %ymm3<br>
+    ; AVX1: [[UV:%[0-9]+]]:_(<16 x s8>), [[UV1:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[COPY]](<32 x s8>)<br>
+    ; AVX1: [[UV2:%[0-9]+]]:_(<16 x s8>), [[UV3:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[COPY1]](<32 x s8>)<br>
+    ; AVX1: [[UV4:%[0-9]+]]:_(<16 x s8>), [[UV5:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[COPY2]](<32 x s8>)<br>
+    ; AVX1: [[UV6:%[0-9]+]]:_(<16 x s8>), [[UV7:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[COPY3]](<32 x s8>)<br>
+    ; AVX1: [[ADD:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV]], [[UV4]]<br>
+    ; AVX1: [[ADD1:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV1]], [[UV5]]<br>
+    ; AVX1: [[ADD2:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV2]], [[UV6]]<br>
+    ; AVX1: [[ADD3:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV3]], [[UV7]]<br>
+    ; AVX1: [[MV:%[0-9]+]]:_(<32 x s8>) = G_MERGE_VALUES [[ADD]](<16 x s8>), [[ADD1]](<16 x s8>)<br>
+    ; AVX1: [[MV1:%[0-9]+]]:_(<32 x s8>) = G_MERGE_VALUES [[ADD2]](<16 x s8>), [[ADD3]](<16 x s8>)<br>
+    ; AVX1: %ymm0 = COPY [[MV]](<32 x s8>)<br>
+    ; AVX1: %ymm1 = COPY [[MV1]](<32 x s8>)<br>
+    ; AVX512F: [[ADD:%[0-9]+]]:_(<32 x s8>) = G_ADD [[COPY]], [[COPY2]]<br>
+    ; AVX512F: [[ADD1:%[0-9]+]]:_(<32 x s8>) = G_ADD [[COPY1]], [[COPY3]]<br>
+    ; AVX512F: %ymm0 = COPY [[ADD]](<32 x s8>)<br>
+    ; AVX512F: %ymm1 = COPY [[ADD1]](<32 x s8>)<br>
+    ; AVX512BW: [[MV:%[0-9]+]]:_(<64 x s8>) = G_MERGE_VALUES [[COPY]](<32 x s8>), [[COPY1]](<32 x s8>)<br>
+    ; AVX512BW: [[MV1:%[0-9]+]]:_(<64 x s8>) = G_MERGE_VALUES [[COPY2]](<32 x s8>), [[COPY3]](<32 x s8>)<br>
+    ; AVX512BW: [[ADD:%[0-9]+]]:_(<64 x s8>) = G_ADD [[MV]], [[MV1]]<br>
+    ; AVX512BW: [[UV:%[0-9]+]]:_(<32 x s8>), [[UV1:%[0-9]+]]:_(<32 x s8>) = G_UNMERGE_VALUES [[ADD]](<64 x s8>)<br>
+    ; AVX512BW: %ymm0 = COPY [[UV]](<32 x s8>)<br>
+    ; AVX512BW: %ymm1 = COPY [[UV1]](<32 x s8>)<br>
+    ; ALL: RET 0, implicit %ymm0, implicit %ymm1<br>
     %2(<32 x s8>) = COPY %ymm0<br>
     %3(<32 x s8>) = COPY %ymm1<br>
     %4(<32 x s8>) = COPY %ymm2<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-add.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-add.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-add.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-add.mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-add.mir Tue Nov 14 14:42:19 2017<br>
@@ -1,3 +1,4 @@<br>
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
 # RUN: llc -mtriple=x86_64-linux-gnu -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X64<br>
 # RUN: llc -mtriple=i386-linux-gnu   -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X32<br>
 --- |<br>
@@ -21,19 +22,35 @@ registers:<br>
 # CHECK-NEXT:     %3(s8) = G_TRUNC %0(s32)<br>
 # CHECK-NEXT:     %4(s8) = G_TRUNC %0(s32)<br>
 # CHECK-NEXT:     %5(s8) = G_ADD %3, %4<br>
-# CHECK-NEXT:     %2(s1) = G_TRUNC %5(s8)<br>
-# CHECK-NEXT:     RET 0<br>
+# CHECK:     RET 0<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
<br>
+    ; X64-LABEL: name: test_add_i1<br>
+    ; X64: [[COPY:%[0-9]+]]:_(s32) = COPY %edx<br>
+    ; X64: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32)<br>
+    ; X64: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32)<br>
+    ; X64: [[ADD:%[0-9]+]]:_(s8) = G_ADD [[TRUNC]], [[TRUNC1]]<br>
+    ; X64: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[ADD]](s8)<br>
+    ; X64: %eax = COPY [[ANYEXT]](s32)<br>
+    ; X64: RET 0<br>
+    ; X32-LABEL: name: test_add_i1<br>
+    ; X32: [[COPY:%[0-9]+]]:_(s32) = COPY %edx<br>
+    ; X32: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32)<br>
+    ; X32: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32)<br>
+    ; X32: [[ADD:%[0-9]+]]:_(s8) = G_ADD [[TRUNC]], [[TRUNC1]]<br>
+    ; X32: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[ADD]](s8)<br>
+    ; X32: %eax = COPY [[ANYEXT]](s32)<br>
+    ; X32: RET 0<br>
     %0(s32) = COPY %edx<br>
     %1(s1) = G_TRUNC %0(s32)<br>
     %2(s1) = G_ADD %1, %1<br>
+    %3:_(s32) = G_ANYEXT %2<br>
+    %eax = COPY %3<br>
     RET 0<br>
 ...<br>
 ---<br>
 name:            test_add_i32<br>
-# ALL-LABEL: name:  test_add_i32<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
@@ -41,21 +58,29 @@ registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
   - { id: 2, class: _ }<br>
-# ALL:          %0:_(s32) = IMPLICIT_DEF<br>
-# ALL-NEXT:     %1:_(s32) = IMPLICIT_DEF<br>
-# ALL-NEXT:     %2:_(s32) = G_ADD %0, %1<br>
-# ALL-NEXT:     RET 0<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
+    ; X64-LABEL: name: test_add_i32<br>
+    ; X64: [[DEF:%[0-9]+]]:_(s32) = IMPLICIT_DEF<br>
+    ; X64: [[DEF1:%[0-9]+]]:_(s32) = IMPLICIT_DEF<br>
+    ; X64: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[DEF]], [[DEF1]]<br>
+    ; X64: %eax = COPY [[ADD]](s32)<br>
+    ; X64: RET 0<br>
+    ; X32-LABEL: name: test_add_i32<br>
+    ; X32: [[DEF:%[0-9]+]]:_(s32) = IMPLICIT_DEF<br>
+    ; X32: [[DEF1:%[0-9]+]]:_(s32) = IMPLICIT_DEF<br>
+    ; X32: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[DEF]], [[DEF1]]<br>
+    ; X32: %eax = COPY [[ADD]](s32)<br>
+    ; X32: RET 0<br>
     %0(s32) = IMPLICIT_DEF<br>
     %1(s32) = IMPLICIT_DEF<br>
     %2(s32) = G_ADD %0, %1<br>
+    %eax = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
 ---<br>
 name:            test_add_i64<br>
-# ALL-LABEL: name:  test_add_i64<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
@@ -63,26 +88,30 @@ registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
   - { id: 2, class: _ }<br>
-# X64:          %0:_(s64) = IMPLICIT_DEF<br>
-# X64-NEXT:     %1:_(s64) = IMPLICIT_DEF<br>
-# X64-NEXT:     %2:_(s64) = G_ADD %0, %1<br>
-# X64-NEXT:     RET 0<br>
-#<br>
-# X32:          %0:_(s64) = IMPLICIT_DEF<br>
-# X32-NEXT:     %1:_(s64) = IMPLICIT_DEF<br>
-# X32-NEXT:     %3:_(s32), %4:_(s32) = G_UNMERGE_VALUES %0(s64)<br>
-# X32-NEXT:     %5:_(s32), %6:_(s32) = G_UNMERGE_VALUES %1(s64)<br>
-# X32-NEXT:     %12:_(s8) = G_CONSTANT i8 0<br>
-# X32-NEXT:     %7:_(s1) = G_TRUNC %12(s8)<br>
-# X32-NEXT:     %8:_(s32), %9:_(s1) = G_UADDE %3, %5, %7<br>
-# X32-NEXT:     %10:_(s32), %11:_(s1) = G_UADDE %4, %6, %9<br>
-# X32-NEXT:     %2:_(s64) = G_MERGE_VALUES %8(s32), %10(s32)<br>
-# X32-NEXT:     RET 0<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
+    ; X64-LABEL: name: test_add_i64<br>
+    ; X64: [[DEF:%[0-9]+]]:_(s64) = IMPLICIT_DEF<br>
+    ; X64: [[DEF1:%[0-9]+]]:_(s64) = IMPLICIT_DEF<br>
+    ; X64: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[DEF]], [[DEF1]]<br>
+    ; X64: %rax = COPY [[ADD]](s64)<br>
+    ; X64: RET 0<br>
+    ; X32-LABEL: name: test_add_i64<br>
+    ; X32: [[DEF:%[0-9]+]]:_(s64) = IMPLICIT_DEF<br>
+    ; X32: [[DEF1:%[0-9]+]]:_(s64) = IMPLICIT_DEF<br>
+    ; X32: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[DEF]](s64)<br>
+    ; X32: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[DEF1]](s64)<br>
+    ; X32: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 0<br>
+    ; X32: [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[C]](s8)<br>
+    ; X32: [[UADDE:%[0-9]+]]:_(s32), [[UADDE1:%[0-9]+]]:_(s1) = G_UADDE [[UV]], [[UV2]], [[TRUNC]]<br>
+    ; X32: [[UADDE2:%[0-9]+]]:_(s32), [[UADDE3:%[0-9]+]]:_(s1) = G_UADDE [[UV1]], [[UV3]], [[UADDE1]]<br>
+    ; X32: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[UADDE]](s32), [[UADDE2]](s32)<br>
+    ; X32: %rax = COPY [[MV]](s64)<br>
+    ; X32: RET 0<br>
     %0(s64) = IMPLICIT_DEF<br>
     %1(s64) = IMPLICIT_DEF<br>
     %2(s64) = G_ADD %0, %1<br>
+    %rax = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-and-<wbr>scalar.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-and-scalar.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-and-scalar.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-and-<wbr>scalar.mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-and-<wbr>scalar.mir Tue Nov 14 14:42:19 2017<br>
@@ -45,11 +45,14 @@ body:             |<br>
     ; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32)<br>
     ; CHECK: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32)<br>
     ; CHECK: [[AND:%[0-9]+]]:_(s8) = G_AND [[TRUNC]], [[TRUNC1]]<br>
-    ; CHECK: [[TRUNC2:%[0-9]+]]:_(s1) = G_TRUNC [[AND]](s8)<br>
+    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[AND]](s8)<br>
+    ; CHECK: %eax = COPY [[ANYEXT]](s32)<br>
     ; CHECK: RET 0<br>
     %0(s32) = COPY %edx<br>
     %1(s1) = G_TRUNC %0(s32)<br>
     %2(s1) = G_AND %1, %1<br>
+    %3:_(s32) = G_ANYEXT %2<br>
+    %eax = COPY %3<br>
     RET 0<br>
 ...<br>
 ---<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-constant.<wbr>mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-constant.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-constant.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-constant.<wbr>mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-constant.<wbr>mir Tue Nov 14 14:42:19 2017<br>
@@ -1,3 +1,4 @@<br>
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
 # RUN: llc -mtriple=i386-linux-gnu   -mattr=+sse2 -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X32<br>
 # RUN: llc -mtriple=x86_64-linux-gnu              -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X64<br>
<br>
@@ -8,7 +9,6 @@<br>
 ...<br>
 ---<br>
 name:            test_constant<br>
-# ALL-LABEL: name:            test_constant<br>
 registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
@@ -17,40 +17,73 @@ registers:<br>
   - { id: 4, class: _ }<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
-    ; ALL: %5:_(s8) = G_CONSTANT i8 -1<br>
-    ; ALL: %0:_(s1) = G_TRUNC %5(s8)<br>
+    ; X32-LABEL: name: test_constant<br>
+    ; X32: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 -1<br>
+    ; X32: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[C]](s8)<br>
+    ; X32: %eax = COPY [[ANYEXT]](s32)<br>
+    ; X32: [[C1:%[0-9]+]]:_(s8) = G_CONSTANT i8 8<br>
+    ; X32: %al = COPY [[C1]](s8)<br>
+    ; X32: [[C2:%[0-9]+]]:_(s16) = G_CONSTANT i16 16<br>
+    ; X32: %ax = COPY [[C2]](s16)<br>
+    ; X32: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 32<br>
+    ; X32: %eax = COPY [[C3]](s32)<br>
+    ; X32: [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 64<br>
+    ; X32: [[C5:%[0-9]+]]:_(s32) = G_CONSTANT i32 0<br>
+    ; X32: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[C4]](s32), [[C5]](s32)<br>
+    ; X32: %rax = COPY [[MV]](s64)<br>
+    ; X32: RET 0<br>
+    ; X64-LABEL: name: test_constant<br>
+    ; X64: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 -1<br>
+    ; X64: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[C]](s8)<br>
+    ; X64: %eax = COPY [[ANYEXT]](s32)<br>
+    ; X64: [[C1:%[0-9]+]]:_(s8) = G_CONSTANT i8 8<br>
+    ; X64: %al = COPY [[C1]](s8)<br>
+    ; X64: [[C2:%[0-9]+]]:_(s16) = G_CONSTANT i16 16<br>
+    ; X64: %ax = COPY [[C2]](s16)<br>
+    ; X64: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 32<br>
+    ; X64: %eax = COPY [[C3]](s32)<br>
+    ; X64: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 64<br>
+    ; X64: %rax = COPY [[C4]](s64)<br>
+    ; X64: RET 0<br>
     %0(s1) = G_CONSTANT i1 1<br>
+    %5:_(s32) = G_ANYEXT %0<br>
+    %eax = COPY %5<br>
<br>
-    ; ALL: %1:_(s8) = G_CONSTANT i8 8<br>
     %1(s8) = G_CONSTANT i8 8<br>
-<br>
-    ; ALL: %2:_(s16) = G_CONSTANT i16 16<br>
+    %al = COPY %1<br>
     %2(s16) = G_CONSTANT i16 16<br>
+    %ax = COPY %2<br>
<br>
-    ; ALL: %3:_(s32) = G_CONSTANT i32 32<br>
     %3(s32) = G_CONSTANT i32 32<br>
+    %eax = COPY %3<br>
<br>
-    ; X64: %4:_(s64) = G_CONSTANT i64 64<br>
<br>
-    ; X32: %6:_(s32) = G_CONSTANT i32 64<br>
-    ; X32: %7:_(s32) = G_CONSTANT i32 0<br>
-    ; X32: %4:_(s64) = G_MERGE_VALUES %6(s32), %7(s32)<br>
     %4(s64) = G_CONSTANT i64 64<br>
+    %rax = COPY %4<br>
<br>
     RET 0<br>
 ...<br>
 ---<br>
 name:            test_fconstant<br>
-# ALL-LABEL: name:            test_fconstant<br>
 registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
 body: |<br>
   bb.0:<br>
-    ; ALL: %0:_(s32) = G_FCONSTANT  float 1.000000e+00<br>
-    ; ALL: %1:_(s64) = G_FCONSTANT  double 2.000000e+00<br>
<br>
+    ; X32-LABEL: name: test_fconstant<br>
+    ; X32: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.000000e+00<br>
+    ; X32: %eax = COPY [[C]](s32)<br>
+    ; X32: [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00<br>
+    ; X32: %rax = COPY [[C1]](s64)<br>
+    ; X64-LABEL: name: test_fconstant<br>
+    ; X64: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.000000e+00<br>
+    ; X64: %eax = COPY [[C]](s32)<br>
+    ; X64: [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00<br>
+    ; X64: %rax = COPY [[C1]](s64)<br>
     %0(s32) = G_FCONSTANT float 1.0<br>
+    %eax = COPY %0<br>
     %1(s64) = G_FCONSTANT double 2.0<br>
+    %rax = COPY %1<br>
 ...<br>
<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-ext-x86-<wbr>64.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-ext-x86-64.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-ext-x86-64.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-ext-x86-<wbr>64.mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-ext-x86-<wbr>64.mir Tue Nov 14 14:42:19 2017<br>
@@ -172,9 +172,10 @@ body:             |<br>
<br>
     ; CHECK-LABEL: name: test_zext_i1<br>
     ; CHECK: [[COPY:%[0-9]+]]:_(s8) = COPY %dil<br>
-    ; CHECK: [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[COPY]](s8)<br>
-    ; CHECK: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[TRUNC]](s1)<br>
-    ; CHECK: %rax = COPY [[ZEXT]](s64)<br>
+    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1<br>
+    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s8)<br>
+    ; CHECK: [[AND:%[0-9]+]]:_(s64) = G_AND [[ANYEXT]], [[C]]<br>
+    ; CHECK: %rax = COPY [[AND]](s64)<br>
     ; CHECK: RET 0, implicit %rax<br>
     %0(s8) = COPY %dil<br>
     %1(s1) = G_TRUNC %0(s8)<br>
@@ -267,8 +268,7 @@ body:             |<br>
<br>
     ; CHECK-LABEL: name: test_anyext_i1<br>
     ; CHECK: [[COPY:%[0-9]+]]:_(s8) = COPY %dil<br>
-    ; CHECK: [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[COPY]](s8)<br>
-    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[TRUNC]](s1)<br>
+    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s8)<br>
     ; CHECK: %rax = COPY [[ANYEXT]](s64)<br>
     ; CHECK: RET 0, implicit %rax<br>
     %0(s8) = COPY %dil<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-ext.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-ext.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-ext.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-ext.mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-ext.mir Tue Nov 14 14:42:19 2017<br>
@@ -1,3 +1,4 @@<br>
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
 # RUN: llc -mtriple=i386-linux-gnu   -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X32<br>
 # RUN: llc -mtriple=x86_64-linux-gnu -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X64<br>
 --- |<br>
@@ -91,21 +92,26 @@<br>
 ...<br>
 ---<br>
 name:            test_zext_i1toi8<br>
-# ALL-LABEL: name:  test_zext_i1toi8<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
 registers:<br>
   - { id: 0, class: _, preferred-register: '' }<br>
   - { id: 1, class: _, preferred-register: '' }<br>
-# ALL:          %0:_(s1) = COPY %edi<br>
-# ALL-NEXT:     %1:_(s8) = G_ZEXT %0(s1)<br>
-# ALL-NEXT:     %al = COPY %1(s8)<br>
-# ALL-NEXT:     RET 0, implicit %al<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi<br>
<br>
+    ; X32-LABEL: name: test_zext_i1toi8<br>
+    ; X32: [[COPY:%[0-9]+]]:_(s1) = COPY %edi<br>
+    ; X32: [[ZEXT:%[0-9]+]]:_(s8) = G_ZEXT [[COPY]](s1)<br>
+    ; X32: %al = COPY [[ZEXT]](s8)<br>
+    ; X32: RET 0, implicit %al<br>
+    ; X64-LABEL: name: test_zext_i1toi8<br>
+    ; X64: [[COPY:%[0-9]+]]:_(s1) = COPY %edi<br>
+    ; X64: [[ZEXT:%[0-9]+]]:_(s8) = G_ZEXT [[COPY]](s1)<br>
+    ; X64: %al = COPY [[ZEXT]](s8)<br>
+    ; X64: RET 0, implicit %al<br>
     %0(s1) = COPY %edi<br>
     %1(s8) = G_ZEXT %0(s1)<br>
     %al = COPY %1(s8)<br>
@@ -114,21 +120,26 @@ body:             |<br>
 ...<br>
 ---<br>
 name:            test_zext_i1toi16<br>
-# ALL-LABEL: name:  test_zext_i1toi16<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
 registers:<br>
   - { id: 0, class: _, preferred-register: '' }<br>
   - { id: 1, class: _, preferred-register: '' }<br>
-# ALL:          %0:_(s1) = COPY %edi<br>
-# ALL-NEXT:     %1:_(s16) = G_ZEXT %0(s1)<br>
-# ALL-NEXT:     %ax = COPY %1(s16)<br>
-# ALL-NEXT:     RET 0, implicit %ax<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi<br>
<br>
+    ; X32-LABEL: name: test_zext_i1toi16<br>
+    ; X32: [[COPY:%[0-9]+]]:_(s1) = COPY %edi<br>
+    ; X32: [[ZEXT:%[0-9]+]]:_(s16) = G_ZEXT [[COPY]](s1)<br>
+    ; X32: %ax = COPY [[ZEXT]](s16)<br>
+    ; X32: RET 0, implicit %ax<br>
+    ; X64-LABEL: name: test_zext_i1toi16<br>
+    ; X64: [[COPY:%[0-9]+]]:_(s1) = COPY %edi<br>
+    ; X64: [[ZEXT:%[0-9]+]]:_(s16) = G_ZEXT [[COPY]](s1)<br>
+    ; X64: %ax = COPY [[ZEXT]](s16)<br>
+    ; X64: RET 0, implicit %ax<br>
     %0(s1) = COPY %edi<br>
     %1(s16) = G_ZEXT %0(s1)<br>
     %ax = COPY %1(s16)<br>
@@ -137,7 +148,6 @@ body:             |<br>
 ...<br>
 ---<br>
 name:            test_zext_i1<br>
-# ALL-LABEL: name:  test_zext_i1<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
@@ -145,15 +155,24 @@ registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
   - { id: 2, class: _ }<br>
-# ALL:          %0:_(s8) = COPY %dil<br>
-# ALL-NEXT:     %1:_(s1) = G_TRUNC %0(s8)<br>
-# ALL-NEXT:     %2:_(s32) = G_ZEXT %1(s1)<br>
-# ALL-NEXT:     %eax = COPY %2(s32)<br>
-# ALL-NEXT:     RET 0, implicit %eax<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi<br>
<br>
+    ; X32-LABEL: name: test_zext_i1<br>
+    ; X32: [[COPY:%[0-9]+]]:_(s8) = COPY %dil<br>
+    ; X32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; X32: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[COPY]](s8)<br>
+    ; X32: [[AND:%[0-9]+]]:_(s32) = G_AND [[ANYEXT]], [[C]]<br>
+    ; X32: %eax = COPY [[AND]](s32)<br>
+    ; X32: RET 0, implicit %eax<br>
+    ; X64-LABEL: name: test_zext_i1<br>
+    ; X64: [[COPY:%[0-9]+]]:_(s8) = COPY %dil<br>
+    ; X64: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1<br>
+    ; X64: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[COPY]](s8)<br>
+    ; X64: [[AND:%[0-9]+]]:_(s32) = G_AND [[ANYEXT]], [[C]]<br>
+    ; X64: %eax = COPY [[AND]](s32)<br>
+    ; X64: RET 0, implicit %eax<br>
     %0(s8) = COPY %dil<br>
     %1(s1) = G_TRUNC %0(s8)<br>
     %2(s32) = G_ZEXT %1(s1)<br>
@@ -163,21 +182,26 @@ body:             |<br>
 ...<br>
 ---<br>
 name:            test_zext_i8toi16<br>
-# ALL-LABEL: name:  test_zext_i8toi16<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
 registers:<br>
   - { id: 0, class: _, preferred-register: '' }<br>
   - { id: 1, class: _, preferred-register: '' }<br>
-# ALL:          %0:_(s8) = COPY %dil<br>
-# ALL-NEXT:     %1:_(s16) = G_ZEXT %0(s8)<br>
-# ALL-NEXT:     %ax = COPY %1(s16)<br>
-# ALL-NEXT:     RET 0, implicit %ax<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi<br>
<br>
+    ; X32-LABEL: name: test_zext_i8toi16<br>
+    ; X32: [[COPY:%[0-9]+]]:_(s8) = COPY %dil<br>
+    ; X32: [[ZEXT:%[0-9]+]]:_(s16) = G_ZEXT [[COPY]](s8)<br>
+    ; X32: %ax = COPY [[ZEXT]](s16)<br>
+    ; X32: RET 0, implicit %ax<br>
+    ; X64-LABEL: name: test_zext_i8toi16<br>
+    ; X64: [[COPY:%[0-9]+]]:_(s8) = COPY %dil<br>
+    ; X64: [[ZEXT:%[0-9]+]]:_(s16) = G_ZEXT [[COPY]](s8)<br>
+    ; X64: %ax = COPY [[ZEXT]](s16)<br>
+    ; X64: RET 0, implicit %ax<br>
     %0(s8) = COPY %dil<br>
     %1(s16) = G_ZEXT %0(s8)<br>
     %ax = COPY %1(s16)<br>
@@ -186,21 +210,26 @@ body:             |<br>
 ...<br>
 ---<br>
 name:            test_zext_i8<br>
-# ALL-LABEL: name:  test_zext_i8<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
 registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
-# ALL:          %0:_(s8) = COPY %dil<br>
-# ALL-NEXT:     %1:_(s32) = G_ZEXT %0(s8)<br>
-# ALL-NEXT:     %eax = COPY %1(s32)<br>
-# ALL-NEXT:     RET 0, implicit %eax<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi<br>
<br>
+    ; X32-LABEL: name: test_zext_i8<br>
+    ; X32: [[COPY:%[0-9]+]]:_(s8) = COPY %dil<br>
+    ; X32: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[COPY]](s8)<br>
+    ; X32: %eax = COPY [[ZEXT]](s32)<br>
+    ; X32: RET 0, implicit %eax<br>
+    ; X64-LABEL: name: test_zext_i8<br>
+    ; X64: [[COPY:%[0-9]+]]:_(s8) = COPY %dil<br>
+    ; X64: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[COPY]](s8)<br>
+    ; X64: %eax = COPY [[ZEXT]](s32)<br>
+    ; X64: RET 0, implicit %eax<br>
     %0(s8) = COPY %dil<br>
     %1(s32) = G_ZEXT %0(s8)<br>
     %eax = COPY %1(s32)<br>
@@ -209,21 +238,26 @@ body:             |<br>
 ...<br>
 ---<br>
 name:            test_zext_i16<br>
-# ALL-LABEL: name:  test_zext_i16<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
 registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
-# ALL:          %0:_(s16) = COPY %di<br>
-# ALL-NEXT:     %1:_(s32) = G_ZEXT %0(s16)<br>
-# ALL-NEXT:     %eax = COPY %1(s32)<br>
-# ALL-NEXT:     RET 0, implicit %eax<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi<br>
<br>
+    ; X32-LABEL: name: test_zext_i16<br>
+    ; X32: [[COPY:%[0-9]+]]:_(s16) = COPY %di<br>
+    ; X32: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[COPY]](s16)<br>
+    ; X32: %eax = COPY [[ZEXT]](s32)<br>
+    ; X32: RET 0, implicit %eax<br>
+    ; X64-LABEL: name: test_zext_i16<br>
+    ; X64: [[COPY:%[0-9]+]]:_(s16) = COPY %di<br>
+    ; X64: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[COPY]](s16)<br>
+    ; X64: %eax = COPY [[ZEXT]](s32)<br>
+    ; X64: RET 0, implicit %eax<br>
     %0(s16) = COPY %di<br>
     %1(s32) = G_ZEXT %0(s16)<br>
     %eax = COPY %1(s32)<br>
@@ -232,22 +266,25 @@ body:             |<br>
 ...<br>
 ---<br>
 name:            test_sext_i1toi8<br>
-# ALL-LABEL: name:  test_sext_i1toi8<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
 registers:<br>
   - { id: 0, class: _, preferred-register: '' }<br>
   - { id: 1, class: _, preferred-register: '' }<br>
-# ALL:          %0:_(s1) = COPY %edi<br>
-# ALL-NEXT:     %1:_(s8) = G_SEXT %0(s1)<br>
-# ALL-NEXT:     %al = COPY %1(s8)<br>
-# ALL-NEXT:     RET 0, implicit %al<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi<br>
<br>
-    %0(s1) = COPY %edi<br>
+    ; X32-LABEL: name: test_sext_i1toi8<br>
+    ; X32: [[DEF:%[0-9]+]]:_(s8) = G_IMPLICIT_DEF<br>
+    ; X32: %al = COPY [[DEF]](s8)<br>
+    ; X32: RET 0, implicit %al<br>
+    ; X64-LABEL: name: test_sext_i1toi8<br>
+    ; X64: [[DEF:%[0-9]+]]:_(s8) = G_IMPLICIT_DEF<br>
+    ; X64: %al = COPY [[DEF]](s8)<br>
+    ; X64: RET 0, implicit %al<br>
+    %0(s1) = G_IMPLICIT_DEF<br>
     %1(s8) = G_SEXT %0(s1)<br>
     %al = COPY %1(s8)<br>
     RET 0, implicit %al<br>
@@ -255,22 +292,25 @@ body:             |<br>
 ...<br>
 ---<br>
 name:            test_sext_i1toi16<br>
-# ALL-LABEL: name:  test_sext_i1toi16<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
 registers:<br>
   - { id: 0, class: _, preferred-register: '' }<br>
   - { id: 1, class: _, preferred-register: '' }<br>
-# ALL:          %0:_(s1) = COPY %edi<br>
-# ALL-NEXT:     %1:_(s16) = G_SEXT %0(s1)<br>
-# ALL-NEXT:     %ax = COPY %1(s16)<br>
-# ALL-NEXT:     RET 0, implicit %ax<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi<br>
<br>
-    %0(s1) = COPY %edi<br>
+    ; X32-LABEL: name: test_sext_i1toi16<br>
+    ; X32: [[DEF:%[0-9]+]]:_(s16) = G_IMPLICIT_DEF<br>
+    ; X32: %ax = COPY [[DEF]](s16)<br>
+    ; X32: RET 0, implicit %ax<br>
+    ; X64-LABEL: name: test_sext_i1toi16<br>
+    ; X64: [[DEF:%[0-9]+]]:_(s16) = G_IMPLICIT_DEF<br>
+    ; X64: %ax = COPY [[DEF]](s16)<br>
+    ; X64: RET 0, implicit %ax<br>
+    %0(s1) = G_IMPLICIT_DEF<br>
     %1(s16) = G_SEXT %0(s1)<br>
     %ax = COPY %1(s16)<br>
     RET 0, implicit %ax<br>
@@ -278,7 +318,6 @@ body:             |<br>
 ...<br>
 ---<br>
 name:            test_sext_i1<br>
-# ALL-LABEL: name:  test_sext_i1<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
@@ -286,39 +325,46 @@ registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
   - { id: 2, class: _ }<br>
-# ALL:          %0:_(s8) = COPY %dil<br>
-# ALL-NEXT:     %1:_(s1) = G_TRUNC %0(s8)<br>
-# ALL-NEXT:     %2:_(s32) = G_SEXT %1(s1)<br>
-# ALL-NEXT:     %eax = COPY %2(s32)<br>
-# ALL-NEXT:     RET 0, implicit %eax<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi<br>
<br>
-    %0(s8) = COPY %dil<br>
-    %1(s1) = G_TRUNC %0(s8)<br>
-    %2(s32) = G_SEXT %1(s1)<br>
+    ; X32-LABEL: name: test_sext_i1<br>
+    ; X32: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF<br>
+    ; X32: %eax = COPY [[DEF]](s32)<br>
+    ; X32: RET 0, implicit %eax<br>
+    ; X64-LABEL: name: test_sext_i1<br>
+    ; X64: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF<br>
+    ; X64: %eax = COPY [[DEF]](s32)<br>
+    ; X64: RET 0, implicit %eax<br>
+    %0(s1) = G_IMPLICIT_DEF<br>
+    %2(s32) = G_SEXT %0(s1)<br>
     %eax = COPY %2(s32)<br>
     RET 0, implicit %eax<br>
<br>
 ...<br>
 ---<br>
 name:            test_sext_i8toi16<br>
-# ALL-LABEL: name:  test_sext_i8toi16<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
 registers:<br>
   - { id: 0, class: _, preferred-register: '' }<br>
   - { id: 1, class: _, preferred-register: '' }<br>
-# ALL:          %0:_(s8) = COPY %dil<br>
-# ALL-NEXT:     %1:_(s16) = G_SEXT %0(s8)<br>
-# ALL-NEXT:     %ax = COPY %1(s16)<br>
-# ALL-NEXT:     RET 0, implicit %ax<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi<br>
<br>
+    ; X32-LABEL: name: test_sext_i8toi16<br>
+    ; X32: [[COPY:%[0-9]+]]:_(s8) = COPY %dil<br>
+    ; X32: [[SEXT:%[0-9]+]]:_(s16) = G_SEXT [[COPY]](s8)<br>
+    ; X32: %ax = COPY [[SEXT]](s16)<br>
+    ; X32: RET 0, implicit %ax<br>
+    ; X64-LABEL: name: test_sext_i8toi16<br>
+    ; X64: [[COPY:%[0-9]+]]:_(s8) = COPY %dil<br>
+    ; X64: [[SEXT:%[0-9]+]]:_(s16) = G_SEXT [[COPY]](s8)<br>
+    ; X64: %ax = COPY [[SEXT]](s16)<br>
+    ; X64: RET 0, implicit %ax<br>
     %0(s8) = COPY %dil<br>
     %1(s16) = G_SEXT %0(s8)<br>
     %ax = COPY %1(s16)<br>
@@ -327,21 +373,26 @@ body:             |<br>
 ...<br>
 ---<br>
 name:            test_sext_i8<br>
-# ALL-LABEL: name:  test_sext_i8<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
 registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
-# ALL:          %0:_(s8) = COPY %dil<br>
-# ALL-NEXT:     %1:_(s32) = G_SEXT %0(s8)<br>
-# ALL-NEXT:     %eax = COPY %1(s32)<br>
-# ALL-NEXT:     RET 0, implicit %eax<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi<br>
<br>
+    ; X32-LABEL: name: test_sext_i8<br>
+    ; X32: [[COPY:%[0-9]+]]:_(s8) = COPY %dil<br>
+    ; X32: [[SEXT:%[0-9]+]]:_(s32) = G_SEXT [[COPY]](s8)<br>
+    ; X32: %eax = COPY [[SEXT]](s32)<br>
+    ; X32: RET 0, implicit %eax<br>
+    ; X64-LABEL: name: test_sext_i8<br>
+    ; X64: [[COPY:%[0-9]+]]:_(s8) = COPY %dil<br>
+    ; X64: [[SEXT:%[0-9]+]]:_(s32) = G_SEXT [[COPY]](s8)<br>
+    ; X64: %eax = COPY [[SEXT]](s32)<br>
+    ; X64: RET 0, implicit %eax<br>
     %0(s8) = COPY %dil<br>
     %1(s32) = G_SEXT %0(s8)<br>
     %eax = COPY %1(s32)<br>
@@ -350,21 +401,26 @@ body:             |<br>
 ...<br>
 ---<br>
 name:            test_sext_i16<br>
-# ALL-LABEL: name:  test_sext_i16<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
 registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
-# ALL:          %0:_(s16) = COPY %di<br>
-# ALL-NEXT:     %1:_(s32) = G_SEXT %0(s16)<br>
-# ALL-NEXT:     %eax = COPY %1(s32)<br>
-# ALL-NEXT:     RET 0, implicit %eax<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi<br>
<br>
+    ; X32-LABEL: name: test_sext_i16<br>
+    ; X32: [[COPY:%[0-9]+]]:_(s16) = COPY %di<br>
+    ; X32: [[SEXT:%[0-9]+]]:_(s32) = G_SEXT [[COPY]](s16)<br>
+    ; X32: %eax = COPY [[SEXT]](s32)<br>
+    ; X32: RET 0, implicit %eax<br>
+    ; X64-LABEL: name: test_sext_i16<br>
+    ; X64: [[COPY:%[0-9]+]]:_(s16) = COPY %di<br>
+    ; X64: [[SEXT:%[0-9]+]]:_(s32) = G_SEXT [[COPY]](s16)<br>
+    ; X64: %eax = COPY [[SEXT]](s32)<br>
+    ; X64: RET 0, implicit %eax<br>
     %0(s16) = COPY %di<br>
     %1(s32) = G_SEXT %0(s16)<br>
     %eax = COPY %1(s32)<br>
@@ -373,21 +429,26 @@ body:             |<br>
 ...<br>
 ---<br>
 name:            test_anyext_i1toi8<br>
-# ALL-LABEL: name:  test_anyext_i1toi8<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
 registers:<br>
   - { id: 0, class: _, preferred-register: '' }<br>
   - { id: 1, class: _, preferred-register: '' }<br>
-# ALL:          %0:_(s1) = COPY %edi<br>
-# ALL-NEXT:     %1:_(s8) = G_ANYEXT %0(s1)<br>
-# ALL-NEXT:     %al = COPY %1(s8)<br>
-# ALL-NEXT:     RET 0, implicit %al<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi<br>
<br>
+    ; X32-LABEL: name: test_anyext_i1toi8<br>
+    ; X32: [[COPY:%[0-9]+]]:_(s1) = COPY %edi<br>
+    ; X32: [[ANYEXT:%[0-9]+]]:_(s8) = G_ANYEXT [[COPY]](s1)<br>
+    ; X32: %al = COPY [[ANYEXT]](s8)<br>
+    ; X32: RET 0, implicit %al<br>
+    ; X64-LABEL: name: test_anyext_i1toi8<br>
+    ; X64: [[COPY:%[0-9]+]]:_(s1) = COPY %edi<br>
+    ; X64: [[ANYEXT:%[0-9]+]]:_(s8) = G_ANYEXT [[COPY]](s1)<br>
+    ; X64: %al = COPY [[ANYEXT]](s8)<br>
+    ; X64: RET 0, implicit %al<br>
     %0(s1) = COPY %edi<br>
     %1(s8) = G_ANYEXT %0(s1)<br>
     %al = COPY %1(s8)<br>
@@ -396,21 +457,26 @@ body:             |<br>
 ...<br>
 ---<br>
 name:            test_anyext_i1toi16<br>
-# ALL-LABEL: name:  test_anyext_i1toi16<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
 registers:<br>
   - { id: 0, class: _, preferred-register: '' }<br>
   - { id: 1, class: _, preferred-register: '' }<br>
-# ALL:          %0:_(s1) = COPY %edi<br>
-# ALL-NEXT:     %1:_(s16) = G_ANYEXT %0(s1)<br>
-# ALL-NEXT:     %ax = COPY %1(s16)<br>
-# ALL-NEXT:     RET 0, implicit %ax<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi<br>
<br>
+    ; X32-LABEL: name: test_anyext_i1toi16<br>
+    ; X32: [[COPY:%[0-9]+]]:_(s1) = COPY %edi<br>
+    ; X32: [[ANYEXT:%[0-9]+]]:_(s16) = G_ANYEXT [[COPY]](s1)<br>
+    ; X32: %ax = COPY [[ANYEXT]](s16)<br>
+    ; X32: RET 0, implicit %ax<br>
+    ; X64-LABEL: name: test_anyext_i1toi16<br>
+    ; X64: [[COPY:%[0-9]+]]:_(s1) = COPY %edi<br>
+    ; X64: [[ANYEXT:%[0-9]+]]:_(s16) = G_ANYEXT [[COPY]](s1)<br>
+    ; X64: %ax = COPY [[ANYEXT]](s16)<br>
+    ; X64: RET 0, implicit %ax<br>
     %0(s1) = COPY %edi<br>
     %1(s16) = G_ANYEXT %0(s1)<br>
     %ax = COPY %1(s16)<br>
@@ -419,7 +485,6 @@ body:             |<br>
 ...<br>
 ---<br>
 name:            test_anyext_i1<br>
-# ALL-LABEL: name:  test_anyext_i1<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
@@ -427,15 +492,20 @@ registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
   - { id: 2, class: _ }<br>
-# ALL:          %0:_(s8) = COPY %dil<br>
-# ALL-NEXT:     %1:_(s1) = G_TRUNC %0(s8)<br>
-# ALL-NEXT:     %2:_(s32) = G_ANYEXT %1(s1)<br>
-# ALL-NEXT:     %eax = COPY %2(s32)<br>
-# ALL-NEXT:     RET 0, implicit %eax<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi<br>
<br>
+    ; X32-LABEL: name: test_anyext_i1<br>
+    ; X32: [[COPY:%[0-9]+]]:_(s8) = COPY %dil<br>
+    ; X32: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[COPY]](s8)<br>
+    ; X32: %eax = COPY [[ANYEXT]](s32)<br>
+    ; X32: RET 0, implicit %eax<br>
+    ; X64-LABEL: name: test_anyext_i1<br>
+    ; X64: [[COPY:%[0-9]+]]:_(s8) = COPY %dil<br>
+    ; X64: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[COPY]](s8)<br>
+    ; X64: %eax = COPY [[ANYEXT]](s32)<br>
+    ; X64: RET 0, implicit %eax<br>
     %0(s8) = COPY %dil<br>
     %1(s1) = G_TRUNC %0(s8)<br>
     %2(s32) = G_ANYEXT %1(s1)<br>
@@ -445,21 +515,26 @@ body:             |<br>
 ...<br>
 ---<br>
 name:            test_anyext_i8toi16<br>
-# ALL-LABEL: name:  test_anyext_i8toi16<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
 registers:<br>
   - { id: 0, class: _, preferred-register: '' }<br>
   - { id: 1, class: _, preferred-register: '' }<br>
-# ALL:          %0:_(s8) = COPY %dil<br>
-# ALL-NEXT:     %1:_(s16) = G_ANYEXT %0(s8)<br>
-# ALL-NEXT:     %ax = COPY %1(s16)<br>
-# ALL-NEXT:     RET 0, implicit %ax<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi<br>
<br>
+    ; X32-LABEL: name: test_anyext_i8toi16<br>
+    ; X32: [[COPY:%[0-9]+]]:_(s8) = COPY %dil<br>
+    ; X32: [[ANYEXT:%[0-9]+]]:_(s16) = G_ANYEXT [[COPY]](s8)<br>
+    ; X32: %ax = COPY [[ANYEXT]](s16)<br>
+    ; X32: RET 0, implicit %ax<br>
+    ; X64-LABEL: name: test_anyext_i8toi16<br>
+    ; X64: [[COPY:%[0-9]+]]:_(s8) = COPY %dil<br>
+    ; X64: [[ANYEXT:%[0-9]+]]:_(s16) = G_ANYEXT [[COPY]](s8)<br>
+    ; X64: %ax = COPY [[ANYEXT]](s16)<br>
+    ; X64: RET 0, implicit %ax<br>
     %0(s8) = COPY %dil<br>
     %1(s16) = G_ANYEXT %0(s8)<br>
     %ax = COPY %1(s16)<br>
@@ -468,21 +543,26 @@ body:             |<br>
 ...<br>
 ---<br>
 name:            test_anyext_i8<br>
-# ALL-LABEL: name:  test_anyext_i8<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
 registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
-# ALL:          %0:_(s8) = COPY %dil<br>
-# ALL-NEXT:     %1:_(s32) = G_ANYEXT %0(s8)<br>
-# ALL-NEXT:     %eax = COPY %1(s32)<br>
-# ALL-NEXT:     RET 0, implicit %eax<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi<br>
<br>
+    ; X32-LABEL: name: test_anyext_i8<br>
+    ; X32: [[COPY:%[0-9]+]]:_(s8) = COPY %dil<br>
+    ; X32: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[COPY]](s8)<br>
+    ; X32: %eax = COPY [[ANYEXT]](s32)<br>
+    ; X32: RET 0, implicit %eax<br>
+    ; X64-LABEL: name: test_anyext_i8<br>
+    ; X64: [[COPY:%[0-9]+]]:_(s8) = COPY %dil<br>
+    ; X64: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[COPY]](s8)<br>
+    ; X64: %eax = COPY [[ANYEXT]](s32)<br>
+    ; X64: RET 0, implicit %eax<br>
     %0(s8) = COPY %dil<br>
     %1(s32) = G_ANYEXT %0(s8)<br>
     %eax = COPY %1(s32)<br>
@@ -491,21 +571,26 @@ body:             |<br>
 ...<br>
 ---<br>
 name:            test_anyext_i16<br>
-# ALL-LABEL: name:  test_anyext_i16<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
 registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
-# ALL:          %0:_(s16) = COPY %di<br>
-# ALL-NEXT:     %1:_(s32) = G_ANYEXT %0(s16)<br>
-# ALL-NEXT:     %eax = COPY %1(s32)<br>
-# ALL-NEXT:     RET 0, implicit %eax<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi<br>
<br>
+    ; X32-LABEL: name: test_anyext_i16<br>
+    ; X32: [[COPY:%[0-9]+]]:_(s16) = COPY %di<br>
+    ; X32: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[COPY]](s16)<br>
+    ; X32: %eax = COPY [[ANYEXT]](s32)<br>
+    ; X32: RET 0, implicit %eax<br>
+    ; X64-LABEL: name: test_anyext_i16<br>
+    ; X64: [[COPY:%[0-9]+]]:_(s16) = COPY %di<br>
+    ; X64: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[COPY]](s16)<br>
+    ; X64: %eax = COPY [[ANYEXT]](s32)<br>
+    ; X64: RET 0, implicit %eax<br>
     %0(s16) = COPY %di<br>
     %1(s32) = G_ANYEXT %0(s16)<br>
     %eax = COPY %1(s32)<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-gep.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-gep.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-gep.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-gep.mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-gep.mir Tue Nov 14 14:42:19 2017<br>
@@ -2,22 +2,22 @@<br>
 # RUN: llc -mtriple=x86_64-linux-gnu -global-isel -run-pass=legalizer %s -o - | FileCheck %s<br>
<br>
 --- |<br>
-  define void @test_gep_i8() {<br>
+  define void @test_gep_i8(i8* %addr) {<br>
     %arrayidx = getelementptr i32, i32* undef, i8 5<br>
     ret void<br>
   }<br>
<br>
-  define void @test_gep_i16() {<br>
+  define void @test_gep_i16(i8* %addr) {<br>
     %arrayidx = getelementptr i32, i32* undef, i16 5<br>
     ret void<br>
   }<br>
<br>
-  define void @test_gep_i32() {<br>
+  define void @test_gep_i32(i8* %addr) {<br>
     %arrayidx = getelementptr i32, i32* undef, i32 5<br>
     ret void<br>
   }<br>
<br>
-  define void @test_gep_i64() {<br>
+  define void @test_gep_i64(i8* %addr) {<br>
     %arrayidx = getelementptr i32, i32* undef, i64 5<br>
     ret void<br>
   }<br>
@@ -36,10 +36,12 @@ body:             |<br>
     ; CHECK: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 20<br>
     ; CHECK: [[SEXT:%[0-9]+]]:_(s32) = G_SEXT [[C]](s8)<br>
     ; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[DEF]], [[SEXT]](s32)<br>
+    ; CHECK: G_STORE [[GEP]](p0), [[DEF]](p0) :: (store 1 into %ir.addr)<br>
     ; CHECK: RET 0<br>
     %0(p0) = IMPLICIT_DEF<br>
     %1(s8) = G_CONSTANT i8 20<br>
     %2(p0) = G_GEP %0, %1(s8)<br>
+    G_STORE %2, %0 :: (store 1 into %ir.addr)<br>
     RET 0<br>
 ...<br>
 ---<br>
@@ -56,10 +58,12 @@ body:             |<br>
     ; CHECK: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 20<br>
     ; CHECK: [[SEXT:%[0-9]+]]:_(s32) = G_SEXT [[C]](s16)<br>
     ; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[DEF]], [[SEXT]](s32)<br>
+    ; CHECK: G_STORE [[GEP]](p0), [[DEF]](p0) :: (store 1 into %ir.addr)<br>
     ; CHECK: RET 0<br>
     %0(p0) = IMPLICIT_DEF<br>
     %1(s16) = G_CONSTANT i16 20<br>
     %2(p0) = G_GEP %0, %1(s16)<br>
+    G_STORE %2, %0 :: (store 1 into %ir.addr)<br>
     RET 0<br>
 ...<br>
 ---<br>
@@ -75,10 +79,12 @@ body:             |<br>
     ; CHECK: [[DEF:%[0-9]+]]:_(p0) = IMPLICIT_DEF<br>
     ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 20<br>
     ; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[DEF]], [[C]](s32)<br>
+    ; CHECK: G_STORE [[GEP]](p0), [[DEF]](p0) :: (store 1 into %ir.addr)<br>
     ; CHECK: RET 0<br>
     %0(p0) = IMPLICIT_DEF<br>
     %1(s32) = G_CONSTANT i32 20<br>
     %2(p0) = G_GEP %0, %1(s32)<br>
+    G_STORE %2, %0 :: (store 1 into %ir.addr)<br>
     RET 0<br>
 ...<br>
 ---<br>
@@ -94,9 +100,11 @@ body:             |<br>
     ; CHECK: [[DEF:%[0-9]+]]:_(p0) = IMPLICIT_DEF<br>
     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 20<br>
     ; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[DEF]], [[C]](s64)<br>
+    ; CHECK: G_STORE [[GEP]](p0), [[DEF]](p0) :: (store 1 into %ir.addr)<br>
     ; CHECK: RET 0<br>
     %0(p0) = IMPLICIT_DEF<br>
     %1(s64) = G_CONSTANT i64 20<br>
     %2(p0) = G_GEP %0, %1(s64)<br>
+    G_STORE %2, %0 :: (store 1 into %ir.addr)<br>
     RET 0<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-memop-<wbr>scalar.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-memop-scalar.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-memop-scalar.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-memop-<wbr>scalar.mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-memop-<wbr>scalar.mir Tue Nov 14 14:42:19 2017<br>
@@ -1,3 +1,4 @@<br>
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
 # RUN: llc -mtriple=x86_64-linux-gnu -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X64<br>
 # RUN: llc -mtriple=i386-linux-gnu   -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X32<br>
<br>
@@ -12,7 +13,6 @@<br>
 ...<br>
 ---<br>
 name:            test_memop_s8tos32<br>
-# ALL-LABEL: name:  test_memop_s8tos32<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
@@ -28,28 +28,40 @@ registers:<br>
   - { id: 8, class: _, preferred-register: '' }<br>
   - { id: 9, class: _, preferred-register: '' }<br>
   - { id: 10, class: _, preferred-register: '' }<br>
-# ALL:          %0:_(p0) = IMPLICIT_DEF<br>
-# ALL-NEXT:     %11:_(s8) = G_LOAD %0(p0) :: (load 1)<br>
-# ALL-NEXT:     %9:_(s1) = G_TRUNC %11(s8)<br>
-# ALL-NEXT:     %1:_(s8) = G_LOAD %0(p0) :: (load 1)<br>
-# ALL-NEXT:     %2:_(s16) = G_LOAD %0(p0) :: (load 2)<br>
-# ALL-NEXT:     %3:_(s32) = G_LOAD %0(p0) :: (load 4)<br>
-# ALL-NEXT:     %4:_(p0) = G_LOAD %0(p0) :: (load 8)<br>
-# ALL-NEXT:     %10:_(s1) = IMPLICIT_DEF<br>
-# ALL-NEXT:     %12:_(s8) = G_ZEXT %10(s1)<br>
-# ALL-NEXT:     G_STORE %12(s8), %0(p0) :: (store 1)<br>
-# ALL-NEXT:     %5:_(s8) = IMPLICIT_DEF<br>
-# ALL-NEXT:     G_STORE %5(s8), %0(p0) :: (store 1)<br>
-# ALL-NEXT:     %6:_(s16) = IMPLICIT_DEF<br>
-# ALL-NEXT:     G_STORE %6(s16), %0(p0) :: (store 2)<br>
-# ALL-NEXT:     %7:_(s32) = IMPLICIT_DEF<br>
-# ALL-NEXT:     G_STORE %7(s32), %0(p0) :: (store 4)<br>
-# ALL-NEXT:     %8:_(p0) = IMPLICIT_DEF<br>
-# ALL-NEXT:     G_STORE %8(p0), %0(p0) :: (store 8)<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %rdi<br>
<br>
+    ; X64-LABEL: name: test_memop_s8tos32<br>
+    ; X64: [[DEF:%[0-9]+]]:_(p0) = IMPLICIT_DEF<br>
+    ; X64: [[LOAD:%[0-9]+]]:_(s8) = G_LOAD [[DEF]](p0) :: (load 1)<br>
+    ; X64: [[LOAD1:%[0-9]+]]:_(s8) = G_LOAD [[DEF]](p0) :: (load 1)<br>
+    ; X64: [[LOAD2:%[0-9]+]]:_(s16) = G_LOAD [[DEF]](p0) :: (load 2)<br>
+    ; X64: [[LOAD3:%[0-9]+]]:_(s32) = G_LOAD [[DEF]](p0) :: (load 4)<br>
+    ; X64: [[LOAD4:%[0-9]+]]:_(p0) = G_LOAD [[DEF]](p0) :: (load 8)<br>
+    ; X64: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 1<br>
+    ; X64: [[COPY:%[0-9]+]]:_(s8) = COPY [[LOAD]](s8)<br>
+    ; X64: [[AND:%[0-9]+]]:_(s8) = G_AND [[COPY]], [[C]]<br>
+    ; X64: G_STORE [[AND]](s8), [[DEF]](p0) :: (store 1)<br>
+    ; X64: G_STORE [[LOAD1]](s8), [[DEF]](p0) :: (store 1)<br>
+    ; X64: G_STORE [[LOAD2]](s16), [[DEF]](p0) :: (store 2)<br>
+    ; X64: G_STORE [[LOAD3]](s32), [[DEF]](p0) :: (store 4)<br>
+    ; X64: G_STORE [[LOAD4]](p0), [[DEF]](p0) :: (store 8)<br>
+    ; X32-LABEL: name: test_memop_s8tos32<br>
+    ; X32: [[DEF:%[0-9]+]]:_(p0) = IMPLICIT_DEF<br>
+    ; X32: [[LOAD:%[0-9]+]]:_(s8) = G_LOAD [[DEF]](p0) :: (load 1)<br>
+    ; X32: [[LOAD1:%[0-9]+]]:_(s8) = G_LOAD [[DEF]](p0) :: (load 1)<br>
+    ; X32: [[LOAD2:%[0-9]+]]:_(s16) = G_LOAD [[DEF]](p0) :: (load 2)<br>
+    ; X32: [[LOAD3:%[0-9]+]]:_(s32) = G_LOAD [[DEF]](p0) :: (load 4)<br>
+    ; X32: [[LOAD4:%[0-9]+]]:_(p0) = G_LOAD [[DEF]](p0) :: (load 8)<br>
+    ; X32: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 1<br>
+    ; X32: [[COPY:%[0-9]+]]:_(s8) = COPY [[LOAD]](s8)<br>
+    ; X32: [[AND:%[0-9]+]]:_(s8) = G_AND [[COPY]], [[C]]<br>
+    ; X32: G_STORE [[AND]](s8), [[DEF]](p0) :: (store 1)<br>
+    ; X32: G_STORE [[LOAD1]](s8), [[DEF]](p0) :: (store 1)<br>
+    ; X32: G_STORE [[LOAD2]](s16), [[DEF]](p0) :: (store 2)<br>
+    ; X32: G_STORE [[LOAD3]](s32), [[DEF]](p0) :: (store 4)<br>
+    ; X32: G_STORE [[LOAD4]](p0), [[DEF]](p0) :: (store 8)<br>
     %0(p0) = IMPLICIT_DEF<br>
     %9(s1) = G_LOAD %0(p0) :: (load 1)<br>
     %1(s8) = G_LOAD %0(p0) :: (load 1)<br>
@@ -57,20 +69,14 @@ body:             |<br>
     %3(s32) = G_LOAD %0(p0) :: (load 4)<br>
     %4(p0) = G_LOAD %0(p0) :: (load 8)<br>
<br>
-    %10(s1) = IMPLICIT_DEF<br>
-    G_STORE %10, %0 :: (store 1)<br>
-    %5(s8) = IMPLICIT_DEF<br>
-    G_STORE %5, %0 :: (store 1)<br>
-    %6(s16) = IMPLICIT_DEF<br>
-    G_STORE %6, %0 :: (store 2)<br>
-    %7(s32) = IMPLICIT_DEF<br>
-    G_STORE %7, %0 :: (store 4)<br>
-    %8(p0) = IMPLICIT_DEF<br>
-    G_STORE %8, %0 :: (store 8)<br>
+    G_STORE %9, %0 :: (store 1)<br>
+    G_STORE %1, %0 :: (store 1)<br>
+    G_STORE %2, %0 :: (store 2)<br>
+    G_STORE %3, %0 :: (store 4)<br>
+    G_STORE %4, %0 :: (store 8)<br>
 ...<br>
 ---<br>
 name:            test_memop_s64<br>
-# ALL-LABEL: name:  test_memop_s64<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
@@ -79,31 +85,28 @@ registers:<br>
   - { id: 1, class: _, preferred-register: '' }<br>
   - { id: 2, class: _, preferred-register: '' }<br>
 liveins:<br>
-# X64:          %0:_(p0) = IMPLICIT_DEF<br>
-# X64-NEXT:     %1:_(s64) = G_LOAD %0(p0) :: (load 8)<br>
-# X64-NEXT:     %2:_(s64) = IMPLICIT_DEF<br>
-# X64-NEXT:     G_STORE %2(s64), %0(p0) :: (store 8)<br>
 #<br>
-# X32:          %0:_(p0) = IMPLICIT_DEF<br>
-# X32-NEXT:     %3:_(s32) = G_LOAD %0(p0) :: (load 8)<br>
-# X32-NEXT:     %6:_(s32) = G_CONSTANT i32 4<br>
-# X32-NEXT:     %5:_(p0) = G_GEP %0, %6(s32)<br>
-# X32-NEXT:     %4:_(s32) = G_LOAD %5(p0) :: (load 8)<br>
-# X32-NEXT:     %1:_(s64) = G_MERGE_VALUES %3(s32), %4(s32)<br>
-# X32-NEXT:     %2:_(s64) = IMPLICIT_DEF<br>
-# X32-NEXT:     %7:_(s32), %8:_(s32) = G_UNMERGE_VALUES %2(s64)<br>
-# X32-NEXT:     G_STORE %7(s32), %0(p0) :: (store 8)<br>
-# X32-NEXT:     %10:_(s32) = G_CONSTANT i32 4<br>
-# X32-NEXT:     %9:_(p0) = G_GEP %0, %10(s32)<br>
-# X32-NEXT:     G_STORE %8(s32), %9(p0) :: (store 8)<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %rdi<br>
<br>
+    ; X64-LABEL: name: test_memop_s64<br>
+    ; X64: [[DEF:%[0-9]+]]:_(p0) = IMPLICIT_DEF<br>
+    ; X64: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[DEF]](p0) :: (load 8)<br>
+    ; X64: G_STORE [[LOAD]](s64), [[DEF]](p0) :: (store 8)<br>
+    ; X32-LABEL: name: test_memop_s64<br>
+    ; X32: [[DEF:%[0-9]+]]:_(p0) = IMPLICIT_DEF<br>
+    ; X32: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[DEF]](p0) :: (load 8)<br>
+    ; X32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 4<br>
+    ; X32: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[DEF]], [[C]](s32)<br>
+    ; X32: [[LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[GEP]](p0) :: (load 8)<br>
+    ; X32: G_STORE [[LOAD]](s32), [[DEF]](p0) :: (store 8)<br>
+    ; X32: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 4<br>
+    ; X32: [[GEP1:%[0-9]+]]:_(p0) = G_GEP [[DEF]], [[C1]](s32)<br>
+    ; X32: G_STORE [[LOAD1]](s32), [[GEP1]](p0) :: (store 8)<br>
     %0(p0) = IMPLICIT_DEF<br>
     %1(s64) = G_LOAD %0(p0) :: (load 8)<br>
<br>
-    %2(s64) = IMPLICIT_DEF<br>
-    G_STORE %2, %0 :: (store 8)<br>
+    G_STORE %1, %0 :: (store 8)<br>
<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-mul-<wbr>scalar.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-mul-scalar.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-mul-scalar.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-mul-<wbr>scalar.mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-mul-<wbr>scalar.mir Tue Nov 14 14:42:19 2017<br>
@@ -1,3 +1,4 @@<br>
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
 # RUN: llc -mtriple=x86_64-linux-gnu -global-isel -run-pass=legalizer %s -o - | FileCheck %s<br>
<br>
 --- |<br>
@@ -21,7 +22,6 @@<br>
 ...<br>
 ---<br>
 name:            test_mul_i1<br>
-# CHECK-LABEL: name:  test_mul_i1<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
@@ -29,45 +29,46 @@ registers:<br>
   - { id: 0, class: _, preferred-register: '' }<br>
   - { id: 1, class: _, preferred-register: '' }<br>
   - { id: 2, class: _, preferred-register: '' }<br>
-# CHECK:          %0:_(s32) = COPY %edx<br>
-# CHECK-NEXT:     %3:_(s8) = G_TRUNC %0(s32)<br>
-# CHECK-NEXT:     %4:_(s8) = G_TRUNC %0(s32)<br>
-# CHECK-NEXT:     %5:_(s8) = G_MUL %3, %4<br>
-# CHECK-NEXT:     %2:_(s1) = G_TRUNC %5(s8)<br>
-# CHECK-NEXT:     RET 0<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
<br>
+    ; CHECK-LABEL: name: test_mul_i1<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY %edx<br>
+    ; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32)<br>
+    ; CHECK: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32)<br>
+    ; CHECK: [[MUL:%[0-9]+]]:_(s8) = G_MUL [[TRUNC]], [[TRUNC1]]<br>
+    ; CHECK: [[DEF:%[0-9]+]]:_(p0) = G_IMPLICIT_DEF<br>
+    ; CHECK: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 1<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s8) = COPY [[MUL]](s8)<br>
+    ; CHECK: [[AND:%[0-9]+]]:_(s8) = G_AND [[COPY1]], [[C]]<br>
+    ; CHECK: G_STORE [[AND]](s8), [[DEF]](p0) :: (store 1)<br>
+    ; CHECK: RET 0<br>
     %0(s32) = COPY %edx<br>
     %1(s1) = G_TRUNC %0(s32)<br>
     %2(s1) = G_MUL %1, %1<br>
+    %3:_(p0) = G_IMPLICIT_DEF<br>
+    G_STORE %2, %3 :: (store 1)<br>
     RET 0<br>
 ...<br>
 ---<br>
 name:            test_mul_i16<br>
-# CHECK-LABEL: name:  test_mul_i16<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
-# CHECK:      registers:<br>
-# CHECK-NEXT:   - { id: 0, class: _, preferred-register: '' }<br>
-# CHECK-NEXT:   - { id: 1, class: _, preferred-register: '' }<br>
-# CHECK-NEXT:   - { id: 2, class: _, preferred-register: '' }<br>
 registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
   - { id: 2, class: _ }<br>
-# CHECK:      body:             |<br>
-# CHECK-NEXT:   bb.0 (%ir-block.0):<br>
-# CHECK-NEXT:     %0:_(s16) = COPY %di<br>
-# CHECK-NEXT:     %1:_(s16) = COPY %si<br>
-# CHECK-NEXT:     %2:_(s16) = G_MUL %0, %1<br>
-# CHECK-NEXT:     %ax = COPY %2(s16)<br>
-# CHECK-NEXT:     RET 0, implicit %ax<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi, %esi<br>
<br>
+    ; CHECK-LABEL: name: test_mul_i16<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(s16) = COPY %di<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s16) = COPY %si<br>
+    ; CHECK: [[MUL:%[0-9]+]]:_(s16) = G_MUL [[COPY]], [[COPY1]]<br>
+    ; CHECK: %ax = COPY [[MUL]](s16)<br>
+    ; CHECK: RET 0, implicit %ax<br>
     %0(s16) = COPY %di<br>
     %1(s16) = COPY %si<br>
     %2(s16) = G_MUL %0, %1<br>
@@ -77,29 +78,23 @@ body:             |<br>
 ...<br>
 ---<br>
 name:            test_mul_i32<br>
-# CHECK-LABEL: name:  test_mul_i32<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
-# CHECK:      registers:<br>
-# CHECK-NEXT:   - { id: 0, class: _, preferred-register: '' }<br>
-# CHECK-NEXT:   - { id: 1, class: _, preferred-register: '' }<br>
-# CHECK-NEXT:   - { id: 2, class: _, preferred-register: '' }<br>
 registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
   - { id: 2, class: _ }<br>
-# CHECK:      body:             |<br>
-# CHECK-NEXT:   bb.0 (%ir-block.0):<br>
-# CHECK-NEXT:     %0:_(s32) = COPY %edi<br>
-# CHECK-NEXT:     %1:_(s32) = COPY %esi<br>
-# CHECK-NEXT:     %2:_(s32) = G_MUL %0, %1<br>
-# CHECK-NEXT:     %eax = COPY %2(s32)<br>
-# CHECK-NEXT:     RET 0, implicit %eax<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %edi, %esi<br>
<br>
+    ; CHECK-LABEL: name: test_mul_i32<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY %edi<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY %esi<br>
+    ; CHECK: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY]], [[COPY1]]<br>
+    ; CHECK: %eax = COPY [[MUL]](s32)<br>
+    ; CHECK: RET 0, implicit %eax<br>
     %0(s32) = COPY %edi<br>
     %1(s32) = COPY %esi<br>
     %2(s32) = G_MUL %0, %1<br>
@@ -109,29 +104,23 @@ body:             |<br>
 ...<br>
 ---<br>
 name:            test_mul_i64<br>
-# CHECK-LABEL: name:  test_mul_i64<br>
 alignment:       4<br>
 legalized:       false<br>
 regBankSelected: false<br>
-# CHECK:      registers:<br>
-# CHECK-NEXT:   - { id: 0, class: _, preferred-register: '' }<br>
-# CHECK-NEXT:   - { id: 1, class: _, preferred-register: '' }<br>
-# CHECK-NEXT:   - { id: 2, class: _, preferred-register: '' }<br>
 registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
   - { id: 2, class: _ }<br>
-# CHECK:      body:             |<br>
-# CHECK-NEXT:   bb.0 (%ir-block.0):<br>
-# CHECK-NEXT:     %0:_(s64) = COPY %rdi<br>
-# CHECK-NEXT:     %1:_(s64) = COPY %rsi<br>
-# CHECK-NEXT:     %2:_(s64) = G_MUL %0, %1<br>
-# CHECK-NEXT:     %rax = COPY %2(s64)<br>
-# CHECK-NEXT:     RET 0, implicit %rax<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
     liveins: %rdi, %rsi<br>
<br>
+    ; CHECK-LABEL: name: test_mul_i64<br>
+    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY %rdi<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY %rsi<br>
+    ; CHECK: [[MUL:%[0-9]+]]:_(s64) = G_MUL [[COPY]], [[COPY1]]<br>
+    ; CHECK: %rax = COPY [[MUL]](s64)<br>
+    ; CHECK: RET 0, implicit %rax<br>
     %0(s64) = COPY %rdi<br>
     %1(s64) = COPY %rsi<br>
     %2(s64) = G_MUL %0, %1<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-or-scalar.<wbr>mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-or-scalar.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-or-scalar.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-or-scalar.<wbr>mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-or-scalar.<wbr>mir Tue Nov 14 14:42:19 2017<br>
@@ -45,11 +45,17 @@ body:             |<br>
     ; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32)<br>
     ; CHECK: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32)<br>
     ; CHECK: [[OR:%[0-9]+]]:_(s8) = G_OR [[TRUNC]], [[TRUNC1]]<br>
-    ; CHECK: [[TRUNC2:%[0-9]+]]:_(s1) = G_TRUNC [[OR]](s8)<br>
+    ; CHECK: [[DEF:%[0-9]+]]:_(p0) = G_IMPLICIT_DEF<br>
+    ; CHECK: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 1<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s8) = COPY [[OR]](s8)<br>
+    ; CHECK: [[AND:%[0-9]+]]:_(s8) = G_AND [[COPY1]], [[C]]<br>
+    ; CHECK: G_STORE [[AND]](s8), [[DEF]](p0) :: (store 1)<br>
     ; CHECK: RET 0<br>
     %0(s32) = COPY %edx<br>
     %1(s1) = G_TRUNC %0(s32)<br>
     %2(s1) = G_OR %1, %1<br>
+    %3:_(p0) = G_IMPLICIT_DEF<br>
+    G_STORE %2, %3 :: (store 1)<br>
     RET 0<br>
 ...<br>
 ---<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-phi.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-phi.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-phi.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-phi.mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-phi.mir Tue Nov 14 14:42:19 2017<br>
@@ -159,9 +159,7 @@ body:             |<br>
   ; ALL:   [[ANYEXT1:%[0-9]+]]:_(s8) = G_ANYEXT [[COPY2]](s1)<br>
   ; ALL: bb.3.cond.end:<br>
   ; ALL:   [[PHI:%[0-9]+]]:_(s8) = G_PHI [[ANYEXT]](s8), %bb.1.cond.true, [[ANYEXT1]](s8), %bb.2.cond.false<br>
-  ; ALL:   [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[PHI]](s8)<br>
-  ; ALL:   [[ZEXT:%[0-9]+]]:_(s8) = G_ZEXT [[TRUNC]](s1)<br>
-  ; ALL:   %al = COPY [[ZEXT]](s8)<br>
+  ; ALL:   %al = COPY<br>
   ; ALL:   RET 0, implicit %al<br>
   bb.1.entry:<br>
     successors: %bb.2.cond.true(0x40000000), %bb.3.cond.false(0x40000000)<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-sub-v128.<wbr>mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-sub-v128.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-sub-v128.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-sub-v128.<wbr>mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-sub-v128.<wbr>mir Tue Nov 14 14:42:19 2017<br>
@@ -43,6 +43,7 @@ body:             |<br>
     %0(<16 x s8>) = IMPLICIT_DEF<br>
     %1(<16 x s8>) = IMPLICIT_DEF<br>
     %2(<16 x s8>) = G_SUB %0, %1<br>
+    %xmm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
@@ -67,6 +68,7 @@ body:             |<br>
     %0(<8 x s16>) = IMPLICIT_DEF<br>
     %1(<8 x s16>) = IMPLICIT_DEF<br>
     %2(<8 x s16>) = G_SUB %0, %1<br>
+    %xmm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
@@ -91,6 +93,7 @@ body:             |<br>
     %0(<4 x s32>) = IMPLICIT_DEF<br>
     %1(<4 x s32>) = IMPLICIT_DEF<br>
     %2(<4 x s32>) = G_SUB %0, %1<br>
+    %xmm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
@@ -115,6 +118,7 @@ body:             |<br>
     %0(<2 x s64>) = IMPLICIT_DEF<br>
     %1(<2 x s64>) = IMPLICIT_DEF<br>
     %2(<2 x s64>) = G_SUB %0, %1<br>
+    %xmm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-sub-v256.<wbr>mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-sub-v256.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-sub-v256.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-sub-v256.<wbr>mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-sub-v256.<wbr>mir Tue Nov 14 14:42:19 2017<br>
@@ -44,6 +44,7 @@ body:             |<br>
     %0(<32 x s8>) = IMPLICIT_DEF<br>
     %1(<32 x s8>) = IMPLICIT_DEF<br>
     %2(<32 x s8>) = G_SUB %0, %1<br>
+    %ymm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
@@ -68,6 +69,7 @@ body:             |<br>
     %0(<16 x s16>) = IMPLICIT_DEF<br>
     %1(<16 x s16>) = IMPLICIT_DEF<br>
     %2(<16 x s16>) = G_SUB %0, %1<br>
+    %ymm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
@@ -92,6 +94,7 @@ body:             |<br>
     %0(<8 x s32>) = IMPLICIT_DEF<br>
     %1(<8 x s32>) = IMPLICIT_DEF<br>
     %2(<8 x s32>) = G_SUB %0, %1<br>
+    %ymm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
@@ -116,6 +119,7 @@ body:             |<br>
     %0(<4 x s64>) = IMPLICIT_DEF<br>
     %1(<4 x s64>) = IMPLICIT_DEF<br>
     %2(<4 x s64>) = G_SUB %0, %1<br>
+    %ymm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-sub-v512.<wbr>mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-sub-v512.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-sub-v512.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-sub-v512.<wbr>mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-sub-v512.<wbr>mir Tue Nov 14 14:42:19 2017<br>
@@ -44,6 +44,7 @@ body:             |<br>
     %0(<64 x s8>) = IMPLICIT_DEF<br>
     %1(<64 x s8>) = IMPLICIT_DEF<br>
     %2(<64 x s8>) = G_SUB %0, %1<br>
+    %zmm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
@@ -68,6 +69,7 @@ body:             |<br>
     %0(<32 x s16>) = IMPLICIT_DEF<br>
     %1(<32 x s16>) = IMPLICIT_DEF<br>
     %2(<32 x s16>) = G_SUB %0, %1<br>
+    %zmm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
@@ -92,6 +94,7 @@ body:             |<br>
     %0(<16 x s32>) = IMPLICIT_DEF<br>
     %1(<16 x s32>) = IMPLICIT_DEF<br>
     %2(<16 x s32>) = G_SUB %0, %1<br>
+    %zmm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
@@ -116,6 +119,7 @@ body:             |<br>
     %0(<8 x s64>) = IMPLICIT_DEF<br>
     %1(<8 x s64>) = IMPLICIT_DEF<br>
     %2(<8 x s64>) = G_SUB %0, %1<br>
+    %zmm0 = COPY %2<br>
     RET 0<br>
<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-sub.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-sub.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-sub.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-sub.mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-sub.mir Tue Nov 14 14:42:19 2017<br>
@@ -28,11 +28,17 @@ body:             |<br>
     ; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32)<br>
     ; CHECK: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32)<br>
     ; CHECK: [[SUB:%[0-9]+]]:_(s8) = G_SUB [[TRUNC]], [[TRUNC1]]<br>
-    ; CHECK: [[TRUNC2:%[0-9]+]]:_(s1) = G_TRUNC [[SUB]](s8)<br>
+    ; CHECK: [[DEF:%[0-9]+]]:_(p0) = G_IMPLICIT_DEF<br>
+    ; CHECK: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 1<br>
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s8) = COPY [[SUB]](s8)<br>
+    ; CHECK: [[AND:%[0-9]+]]:_(s8) = G_AND [[COPY1]], [[C]]<br>
+    ; CHECK: G_STORE [[AND]](s8), [[DEF]](p0) :: (store 1)<br>
     ; CHECK: RET 0<br>
     %0(s32) = COPY %edx<br>
     %1(s1) = G_TRUNC %0(s32)<br>
     %2(s1) = G_SUB %1, %1<br>
+    %3:_(p0) = G_IMPLICIT_DEF<br>
+    G_STORE %2, %3 :: (store 1)<br>
     RET 0<br>
 ...<br>
 ---<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-trunc.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-trunc.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-trunc.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-trunc.mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-trunc.mir Tue Nov 14 14:42:19 2017<br>
@@ -1,3 +1,4 @@<br>
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
 # RUN: llc -mtriple=i386-linux-gnu   -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X32<br>
 # RUN: llc -mtriple=x86_64-linux-gnu -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X64<br>
 --- |<br>
@@ -8,7 +9,6 @@<br>
 ...<br>
 ---<br>
 name:            trunc_check<br>
-# ALL-LABEL: name:            trunc_check<br>
 registers:<br>
   - { id: 0, class: _ }<br>
   - { id: 1, class: _ }<br>
@@ -16,15 +16,40 @@ registers:<br>
   - { id: 3, class: _ }<br>
 body:             |<br>
   bb.1 (%ir-block.0):<br>
+    ; X32-LABEL: name: trunc_check<br>
+    ; X32: [[DEF:%[0-9]+]]:_(s32) = IMPLICIT_DEF<br>
+    ; X32: [[DEF1:%[0-9]+]]:_(p0) = G_IMPLICIT_DEF<br>
+    ; X32: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 1<br>
+    ; X32: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[DEF]](s32)<br>
+    ; X32: [[AND:%[0-9]+]]:_(s8) = G_AND [[TRUNC]], [[C]]<br>
+    ; X32: G_STORE [[AND]](s8), [[DEF1]](p0) :: (store 1)<br>
+    ; X32: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[DEF]](s32)<br>
+    ; X32: G_STORE [[TRUNC1]](s8), [[DEF1]](p0) :: (store 8)<br>
+    ; X32: [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[DEF]](s32)<br>
+    ; X32: G_STORE [[TRUNC2]](s16), [[DEF1]](p0) :: (store 16)<br>
+    ; X32: RET 0<br>
+    ; X64-LABEL: name: trunc_check<br>
+    ; X64: [[DEF:%[0-9]+]]:_(s32) = IMPLICIT_DEF<br>
+    ; X64: [[DEF1:%[0-9]+]]:_(p0) = G_IMPLICIT_DEF<br>
+    ; X64: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 1<br>
+    ; X64: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[DEF]](s32)<br>
+    ; X64: [[AND:%[0-9]+]]:_(s8) = G_AND [[TRUNC]], [[C]]<br>
+    ; X64: G_STORE [[AND]](s8), [[DEF1]](p0) :: (store 1)<br>
+    ; X64: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[DEF]](s32)<br>
+    ; X64: G_STORE [[TRUNC1]](s8), [[DEF1]](p0) :: (store 8)<br>
+    ; X64: [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[DEF]](s32)<br>
+    ; X64: G_STORE [[TRUNC2]](s16), [[DEF1]](p0) :: (store 16)<br>
+    ; X64: RET 0<br>
     %0(s32) = IMPLICIT_DEF<br>
-    ; ALL: %1:_(s1)  = G_TRUNC %0(s32)<br>
     %1(s1)  = G_TRUNC %0(s32)<br>
+    %4:_(p0) = G_IMPLICIT_DEF<br>
+    G_STORE %1, %4 :: (store 1)<br>
<br>
-    ; ALL: %2:_(s8)  = G_TRUNC %0(s32)<br>
     %2(s8)  = G_TRUNC %0(s32)<br>
+    G_STORE %2, %4 :: (store 8)<br>
<br>
-    ; ALL: %3:_(s16) = G_TRUNC %0(s32)<br>
     %3(s16) = G_TRUNC %0(s32)<br>
+    G_STORE %3, %4 :: (store 16)<br>
     RET 0<br>
<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-undef.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-undef.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-undef.mir?rev=318210&<wbr>r1=318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-undef.mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-undef.mir Tue Nov 14 14:42:19 2017<br>
@@ -1,29 +1,51 @@<br>
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.<wbr>py<br>
 # RUN: llc -mtriple=x86_64-linux-gnu -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X64<br>
 # RUN: llc -mtriple=i386-linux-gnu   -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X32<br>
<br>
 ---<br>
 name:            test_implicit_def<br>
-# ALL-LABEL: name:  test_implicit_def<br>
 registers:<br>
-# X64:          %0:_(s1) = G_IMPLICIT_DEF<br>
-# X64-NEXT:     %1:_(s8) = G_IMPLICIT_DEF<br>
-# X64-NEXT:     %2:_(s16) = G_IMPLICIT_DEF<br>
-# X64-NEXT:     %3:_(s32) = G_IMPLICIT_DEF<br>
-# X64-NEXT:     %4:_(s64) = G_IMPLICIT_DEF<br>
 #<br>
-# X32:          %0:_(s1) = G_IMPLICIT_DEF<br>
-# X32-NEXT:     %1:_(s8) = G_IMPLICIT_DEF<br>
-# X32-NEXT:     %2:_(s16) = G_IMPLICIT_DEF<br>
-# X32-NEXT:     %3:_(s32) = G_IMPLICIT_DEF<br>
-# X32-NEXT:     %5:_(s32) = G_IMPLICIT_DEF<br>
-# X32-NEXT:     %6:_(s32) = G_IMPLICIT_DEF<br>
-# X32-NEXT:     %4:_(s64) = G_MERGE_VALUES %5(s32), %6(s32)<br>
 body: |<br>
   bb.0.entry:<br>
     liveins:<br>
+    ; X64-LABEL: name: test_implicit_def<br>
+    ; X64: [[DEF:%[0-9]+]]:_(p0) = G_IMPLICIT_DEF<br>
+    ; X64: [[DEF1:%[0-9]+]]:_(s8) = G_IMPLICIT_DEF<br>
+    ; X64: G_STORE [[DEF1]](s8), [[DEF]](p0) :: (store 1)<br>
+    ; X64: [[DEF2:%[0-9]+]]:_(s8) = G_IMPLICIT_DEF<br>
+    ; X64: G_STORE [[DEF2]](s8), [[DEF]](p0) :: (store 8)<br>
+    ; X64: [[DEF3:%[0-9]+]]:_(s16) = G_IMPLICIT_DEF<br>
+    ; X64: G_STORE [[DEF3]](s16), [[DEF]](p0) :: (store 16)<br>
+    ; X64: [[DEF4:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF<br>
+    ; X64: G_STORE [[DEF4]](s32), [[DEF]](p0) :: (store 32)<br>
+    ; X64: [[DEF5:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF<br>
+    ; X64: G_STORE [[DEF5]](s64), [[DEF]](p0) :: (store 64)<br>
+    ; X32-LABEL: name: test_implicit_def<br>
+    ; X32: [[DEF:%[0-9]+]]:_(p0) = G_IMPLICIT_DEF<br>
+    ; X32: [[DEF1:%[0-9]+]]:_(s8) = G_IMPLICIT_DEF<br>
+    ; X32: G_STORE [[DEF1]](s8), [[DEF]](p0) :: (store 1)<br>
+    ; X32: [[DEF2:%[0-9]+]]:_(s8) = G_IMPLICIT_DEF<br>
+    ; X32: G_STORE [[DEF2]](s8), [[DEF]](p0) :: (store 8)<br>
+    ; X32: [[DEF3:%[0-9]+]]:_(s16) = G_IMPLICIT_DEF<br>
+    ; X32: G_STORE [[DEF3]](s16), [[DEF]](p0) :: (store 16)<br>
+    ; X32: [[DEF4:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF<br>
+    ; X32: G_STORE [[DEF4]](s32), [[DEF]](p0) :: (store 32)<br>
+    ; X32: [[DEF5:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF<br>
+    ; X32: [[DEF6:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF<br>
+    ; X32: G_STORE [[DEF5]](s32), [[DEF]](p0) :: (store 64)<br>
+    ; X32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 4<br>
+    ; X32: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[DEF]], [[C]](s32)<br>
+    ; X32: G_STORE [[DEF6]](s32), [[GEP]](p0) :: (store 64)<br>
+    %5:_(p0) = G_IMPLICIT_DEF<br>
     %0:_(s1) = G_IMPLICIT_DEF<br>
+    G_STORE %0, %5 ::(store 1)<br>
     %1:_(s8) = G_IMPLICIT_DEF<br>
+    G_STORE %1, %5 ::(store 8)<br>
     %2:_(s16) = G_IMPLICIT_DEF<br>
+    G_STORE %2, %5 ::(store 16)<br>
     %3:_(s32) = G_IMPLICIT_DEF<br>
+    G_STORE %3, %5 ::(store 32)<br>
     %4:_(s64) = G_IMPLICIT_DEF<br>
+    G_STORE %4, %5 ::(store 64)<br>
 ...<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-xor-<wbr>scalar.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/legalize-xor-scalar.mir?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/<wbr>legalize-xor-scalar.mir?rev=<wbr>318210&r1=318209&r2=318210&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-xor-<wbr>scalar.mir (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/legalize-xor-<wbr>scalar.mir Tue Nov 14 14:42:19 2017<br>
@@ -45,11 +45,12 @@ body:             |<br>
     ; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32)<br>
     ; CHECK: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32)<br>
     ; CHECK: [[XOR:%[0-9]+]]:_(s8) = G_XOR [[TRUNC]], [[TRUNC1]]<br>
-    ; CHECK: [[TRUNC2:%[0-9]+]]:_(s1) = G_TRUNC [[XOR]](s8)<br>
     ; CHECK: RET 0<br>
     %0(s32) = COPY %edx<br>
     %1(s1) = G_TRUNC %0(s32)<br>
     %2(s1) = G_XOR %1, %1<br>
+    %3:_(p0) = G_IMPLICIT_DEF<br>
+    G_STORE %2, %3 ::(store 1)<br>
     RET 0<br>
 ...<br>
 ---<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/or-scalar.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/or-scalar.ll?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/or-<wbr>scalar.ll?rev=318210&r1=<wbr>318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/or-scalar.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/or-scalar.ll Tue Nov 14 14:42:19 2017<br>
@@ -7,6 +7,7 @@ define i32 @test_or_i1(i32 %arg1, i32 %a<br>
 ; ALL-NEXT:    cmpl %esi, %edi<br>
 ; ALL-NEXT:    sete %al<br>
 ; ALL-NEXT:    orb %al, %al<br>
+; ALL-NEXT:    movzbl %al, %eax<br>
 ; ALL-NEXT:    andl $1, %eax<br>
 ; ALL-NEXT:    retq<br>
   %c = icmp eq i32 %arg1, %arg2<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/sub-scalar.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/sub-scalar.ll?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/sub-<wbr>scalar.ll?rev=318210&r1=<wbr>318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/sub-scalar.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/sub-scalar.ll Tue Nov 14 14:42:19 2017<br>
@@ -45,8 +45,8 @@ define i32 @test_sub_i1(i32 %arg1, i32 %<br>
 ; X64-LABEL: test_sub_i1:<br>
 ; X64:       # BB#0:<br>
 ; X64-NEXT:    subb %sil, %dil<br>
-; X64-NEXT:    andl $1, %edi<br>
-; X64-NEXT:    movl %edi, %eax<br>
+; X64-NEXT:    movzbl %dil, %eax<br>
+; X64-NEXT:    andl $1, %eax<br>
 ; X64-NEXT:    retq<br>
   %a1 = trunc i32 %arg1 to i1<br>
   %a2 = trunc i32 %arg2 to i1<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/x86_64-fallback.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/x86_64-fallback.ll?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/x86_64-<wbr>fallback.ll?rev=318210&r1=<wbr>318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/x86_64-fallback.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/x86_64-fallback.ll Tue Nov 14 14:42:19 2017<br>
@@ -8,7 +8,7 @@<br>
 ; the fallback path.<br>
<br>
 ; Check that we fallback on invoke translation failures.<br>
-; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: %vreg1<def>(s80) = G_FCONSTANT x86_fp80 0xK4002A000000000000000<br>
+; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: G_STORE %vreg1, %vreg0; mem:ST10[%ptr](align=16) (in function: test_x86_fp80_dump)<br>
 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for test_x86_fp80_dump<br>
 ; FALLBACK-WITH-REPORT-OUT-<wbr>LABEL: test_x86_fp80_dump:<br>
 define void @test_x86_fp80_dump(x86_fp80* %ptr){<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/xor-scalar.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/xor-scalar.ll?rev=318210&r1=318209&r2=318210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/X86/GlobalISel/xor-<wbr>scalar.ll?rev=318210&r1=<wbr>318209&r2=318210&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/xor-scalar.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/<wbr>GlobalISel/xor-scalar.ll Tue Nov 14 14:42:19 2017<br>
@@ -7,6 +7,7 @@ define i32 @test_xor_i1(i32 %arg1, i32 %<br>
 ; ALL-NEXT:    cmpl %esi, %edi<br>
 ; ALL-NEXT:    sete %al<br>
 ; ALL-NEXT:    xorb %al, %al<br>
+; ALL-NEXT:    movzbl %al, %eax<br>
 ; ALL-NEXT:    andl $1, %eax<br>
 ; ALL-NEXT:    retq<br>
   %c = icmp eq i32 %arg1, %arg2<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>