[PATCH] D38616: [RegisterCoalescer] Don't set read-undef if there is a previous def

Matthias Braun via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 10 12:02:36 PDT 2017


MatzeB added a comment.

Thanks for the patch and the testcase, this looks good.

I slightly simplified the testcase to this while trying out the patch:

  # RUN: llc -mtriple=x86_64-- %s -o - -run-pass=simple-register-coalescing | FileCheck %s
  ---
  name: f
  body: |
    bb.0:
      JB_1 %bb.2, undef implicit killed %eflags
      JMP_1 %bb.1
  
    bb.1:
      %0 : gr64 = IMPLICIT_DEF
      NOOP implicit-def undef %1.sub_32bit : gr64
      NOOP implicit-def %1.sub_16bit : gr64
      JMP_1 %bb.3
  
    bb.2:
      NOOP implicit-def %0
      %1 = COPY %0
  
    bb.3:
      NOOP implicit killed %0
      NOOP implicit killed %1
  ...
  
  # We should have a setting of both sub_32bit and sub_16bit. The first one
  # should be undef and not dead, and the second should not be undef.
  
  # CHECK-NOT:  dead
  # CHECK:      NOOP implicit-def undef %1.sub_32bit
  # CHECK-NOT:  undef
  # CHECK-NEXT: NOOP implicit-def %1.sub_16bit



================
Comment at: lib/CodeGen/RegisterCoalescer.cpp:2688-2692
               if (MO.getSubReg() != 0)
-                MO.setIsUndef(EraseImpDef);
+                // Only set undef on the MO if we can't find any reaching
+                // definition of the value. If it does exist and we set undef on
+                // the MO we will effectively kill the reaching definition.
+                MO.setIsUndef(EraseImpDef && !LR.getVNInfoBefore(Def));
----------------
I wonder if we shouldn't change it to this instead which:
```
              if (MO.getSubReg() != 0 && MO.isUndef() && !EraseImpDef)
                MO.setIsUndef(false);
```
it's simpler, matches the comment in front of the for and it seems to pass the x86 tests at least...


https://reviews.llvm.org/D38616





More information about the llvm-commits mailing list