[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