[PATCH] D51502: [X86] Fix register resizings for inline assembly register operands.

Nirav Dave via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 30 12:14:55 PDT 2018


niravd created this revision.
niravd added reviewers: eli.friedman, craig.topper.
Herald added a subscriber: hiraditya.

When replacing a named register input to the appropriately sized
sub/super-register, make sure that register is valid.

Fixes PR38730.


Repository:
  rL LLVM

https://reviews.llvm.org/D51502

Files:
  llvm/lib/Target/X86/X86ISelLowering.cpp
  llvm/test/CodeGen/X86/pr38730.ll


Index: llvm/test/CodeGen/X86/pr38730.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/X86/pr38730.ll
@@ -0,0 +1,26 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -o - %s -mtriple=i386-unknown-linux-gnu | FileCheck %s
+
+ at a = common dso_local local_unnamed_addr global i32 0, align 4
+
+; Function Attrs: nounwind
+define dso_local i32 @b() local_unnamed_addr {
+; CHECK-LABEL: b:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    pushl %esi
+; CHECK-NEXT:    .cfi_def_cfa_offset 8
+; CHECK-NEXT:    .cfi_offset %esi, -8
+; CHECK-NEXT:    movl a, %eax
+; CHECK-NEXT:    #APP
+; CHECK-NEXT:    #NO_APP
+; CHECK-NEXT:    movl %eax, a
+; CHECK-NEXT:    popl %esi
+; CHECK-NEXT:    .cfi_def_cfa_offset 4
+; CHECK-NEXT:    retl
+entry:
+  %0 = load i32, i32* @a, align 4
+  %1 = tail call { i64, i32 } asm "", "={edx},=r,1,~{dirflag},~{fpsr},~{flags}"(i32 %0)
+  %asmresult1 = extractvalue { i64, i32 } %1, 1
+  store i32 %asmresult1, i32* @a, align 4
+  ret i32 undef
+}
Index: llvm/lib/Target/X86/X86ISelLowering.cpp
===================================================================
--- llvm/lib/Target/X86/X86ISelLowering.cpp
+++ llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -41118,8 +41118,9 @@
           Size == 8 ? (is64Bit ? &X86::GR8RegClass : &X86::GR8_NOREXRegClass)
         : Size == 16 ? (is64Bit ? &X86::GR16RegClass : &X86::GR16_NOREXRegClass)
         : Size == 32 ? (is64Bit ? &X86::GR32RegClass : &X86::GR32_NOREXRegClass)
-        : &X86::GR64RegClass;
-      if (RC->contains(DestReg))
+        : Size == 64 ? (is64Bit ? &X86::GR64RegClass : nullptr)
+        : nullptr; 
+      if (RC && RC->contains(DestReg))
         Res = std::make_pair(DestReg, RC);
     } else {
       // No register found/type mismatch.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D51502.163390.patch
Type: text/x-patch
Size: 1835 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180830/33ca7f17/attachment.bin>


More information about the llvm-commits mailing list