[PATCH] D91933: [X86] Do not allow FixupSetCC to relax constraints

Harald van Dijk via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Nov 22 17:49:47 PST 2020


hvdijk updated this revision to Diff 306950.
hvdijk added a comment.

Fix FileCheck syntax at the same time, using `CHECK-X32-DAG` rather than `CHECK-DAG-X32` that @pengfei noticed in D91339 <https://reviews.llvm.org/D91339> after it had been committed already.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D91933/new/

https://reviews.llvm.org/D91933

Files:
  llvm/lib/Target/X86/X86FixupSetCC.cpp
  llvm/test/CodeGen/X86/pic.ll


Index: llvm/test/CodeGen/X86/pic.ll
===================================================================
--- llvm/test/CodeGen/X86/pic.ll
+++ llvm/test/CodeGen/X86/pic.ll
@@ -1,6 +1,6 @@
-; RUN: llc < %s -mcpu=generic -mtriple=i686-pc-linux-gnu -relocation-model=pic -asm-verbose=false -post-RA-scheduler=false | FileCheck %s -check-prefixes=CHECK,CHECK-I686
-; RUN: llc < %s -mcpu=generic -mtriple=x86_64-pc-linux-gnux32 -relocation-model=pic -asm-verbose=false -post-RA-scheduler=false | FileCheck %s -check-prefixes=CHECK,CHECK-X32
-; RUN: llc < %s -mcpu=generic -mtriple=x86_64-pc-linux-gnux32 -relocation-model=pic -asm-verbose=false -post-RA-scheduler=false -fast-isel | FileCheck %s -check-prefixes=CHECK,CHECK-X32
+; RUN: llc < %s -mcpu=generic -mtriple=i686-pc-linux-gnu -relocation-model=pic -asm-verbose=false -post-RA-scheduler=false -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,CHECK-I686
+; RUN: llc < %s -mcpu=generic -mtriple=x86_64-pc-linux-gnux32 -relocation-model=pic -asm-verbose=false -post-RA-scheduler=false -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,CHECK-X32
+; RUN: llc < %s -mcpu=generic -mtriple=x86_64-pc-linux-gnux32 -relocation-model=pic -asm-verbose=false -post-RA-scheduler=false -fast-isel -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,CHECK-X32
 
 @ptr = external global i32* 
 @dst = external global i32 
@@ -22,9 +22,9 @@
 ; CHECK-I686:	movl	ptr at GOT(%eax),
 ; CHECK-I686:	movl	src at GOT(%eax),
 ; CHECK-I686:	ret
-; CHECK-DAG-X32:	movl	dst at GOTPCREL(%rip),
-; CHECK-DAG-X32:	movl	ptr at GOTPCREL(%rip),
-; CHECK-DAG-X32:	movl	src at GOTPCREL(%rip),
+; CHECK-X32-DAG:	movl	dst at GOTPCREL(%rip),
+; CHECK-X32-DAG:	movl	ptr at GOTPCREL(%rip),
+; CHECK-X32-DAG:	movl	src at GOTPCREL(%rip),
 ; CHECK-X32:	retq
 }
 
@@ -48,9 +48,9 @@
 ; CHECK-I686:	movl	ptr2 at GOT(%eax),
 ; CHECK-I686:	movl	src2 at GOT(%eax),
 ; CHECK-I686:	ret
-; CHECK-DAG-X32:	movl	dst2 at GOTPCREL(%rip),
-; CHECK-DAG-X32:	movl	ptr2 at GOTPCREL(%rip),
-; CHECK-DAG-X32:	movl	src2 at GOTPCREL(%rip),
+; CHECK-X32-DAG:	movl	dst2 at GOTPCREL(%rip),
+; CHECK-X32-DAG:	movl	ptr2 at GOTPCREL(%rip),
+; CHECK-X32-DAG:	movl	src2 at GOTPCREL(%rip),
 ; CHECK-X32:	retq
 
 }
Index: llvm/lib/Target/X86/X86FixupSetCC.cpp
===================================================================
--- llvm/lib/Target/X86/X86FixupSetCC.cpp
+++ llvm/lib/Target/X86/X86FixupSetCC.cpp
@@ -97,28 +97,28 @@
       if (FlagsDefMI->readsRegister(X86::EFLAGS))
         continue;
 
-      ++NumSubstZexts;
-      Changed = true;
-
       // On 32-bit, we need to be careful to force an ABCD register.
       const TargetRegisterClass *RC = MF.getSubtarget<X86Subtarget>().is64Bit()
                                           ? &X86::GR32RegClass
                                           : &X86::GR32_ABCDRegClass;
-      Register ZeroReg = MRI->createVirtualRegister(RC);
-      Register InsertReg = MRI->createVirtualRegister(RC);
+      if (!MRI->constrainRegClass(ZExt->getOperand(0).getReg(), RC))
+        continue;
+
+      ++NumSubstZexts;
+      Changed = true;
 
       // Initialize a register with 0. This must go before the eflags def
+      Register ZeroReg = MRI->createVirtualRegister(RC);
       BuildMI(MBB, FlagsDefMI, MI.getDebugLoc(), TII->get(X86::MOV32r0),
               ZeroReg);
 
       // X86 setcc only takes an output GR8, so fake a GR32 input by inserting
       // the setcc result into the low byte of the zeroed register.
       BuildMI(*ZExt->getParent(), ZExt, ZExt->getDebugLoc(),
-              TII->get(X86::INSERT_SUBREG), InsertReg)
+              TII->get(X86::INSERT_SUBREG), ZExt->getOperand(0).getReg())
           .addReg(ZeroReg)
           .addReg(MI.getOperand(0).getReg())
           .addImm(X86::sub_8bit);
-      MRI->replaceRegWith(ZExt->getOperand(0).getReg(), InsertReg);
       ToErase.push_back(ZExt);
     }
   }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D91933.306950.patch
Type: text/x-patch
Size: 3848 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20201123/b5d73076/attachment.bin>


More information about the llvm-commits mailing list