[llvm] r232652 - TableGen: Fix register class lane masks being too conservative.

Matthias Braun matze at braunis.de
Wed Mar 18 10:56:09 PDT 2015


Author: matze
Date: Wed Mar 18 12:56:09 2015
New Revision: 232652

URL: http://llvm.org/viewvc/llvm-project?rev=232652&view=rev
Log:
TableGen: Fix register class lane masks being too conservative.

When calculating the lanemask of a register class we have to include the
masks of subregisters supported by any of the class members, not just
the ones supported by all class members.

This fixes problems when coalescing towards a subclass with additional
subregisters available.

The attached testcase works fine as is, but does crash if you enable
subregister liveness on x86 without this change applied.

Added:
    llvm/trunk/test/CodeGen/X86/coalescer-subreg.ll
Modified:
    llvm/trunk/utils/TableGen/CodeGenRegisters.cpp

Added: llvm/trunk/test/CodeGen/X86/coalescer-subreg.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/coalescer-subreg.ll?rev=232652&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/coalescer-subreg.ll (added)
+++ llvm/trunk/test/CodeGen/X86/coalescer-subreg.ll Wed Mar 18 12:56:09 2015
@@ -0,0 +1,29 @@
+; RUN: llc -o - %s -verify-machineinstrs
+; This used to crash when coalescing a regclass like GR16 which did not support
+; the sub_8bit_hi subregister with a class like GR16_ABCD that did.
+target triple = "x86_64-apple-macosx10.10.0"
+
+define void @test() #0 {
+entry:
+  br i1 undef, label %loop, label %for.end597
+
+loop:
+  %0 = load i16, i16* null, align 4
+  %1 = load i16, i16* undef, align 4
+  %or1 = or i16 %1, %0
+  %or2 = trunc i16 %or1 to i8
+  store i8 %or2, i8* undef, align 4
+  %2 = or i16 %1, %0
+  %or3 = lshr i16 %2, 8
+  %or4 = trunc i16 %or3 to i8
+  store i8 %or4, i8* undef, align 1
+  %3 = load i32, i32* undef, align 4
+  %4 = load i32, i32* undef, align 4
+  %or5 = or i32 %4, %3
+  store i32 %or5, i32* undef, align 4
+  store i32 0, i32* undef, align 4
+  br label %loop
+
+for.end597:
+  ret void
+}

Modified: llvm/trunk/utils/TableGen/CodeGenRegisters.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenRegisters.cpp?rev=232652&r1=232651&r2=232652&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/CodeGenRegisters.cpp (original)
+++ llvm/trunk/utils/TableGen/CodeGenRegisters.cpp Wed Mar 18 12:56:09 2015
@@ -1260,7 +1260,7 @@ void CodeGenRegBank::computeSubRegLaneMa
   for (auto &RegClass : RegClasses) {
     unsigned LaneMask = 0;
     for (const auto &SubRegIndex : SubRegIndices) {
-      if (RegClass.getSubClassWithSubReg(&SubRegIndex) != &RegClass)
+      if (RegClass.getSubClassWithSubReg(&SubRegIndex) == nullptr)
         continue;
       LaneMask |= SubRegIndex.LaneMask;
     }





More information about the llvm-commits mailing list