[PATCH] D71178: [x86] Don't assume sign-extension of arguments smaller than 32-bits.

Emilio Cobos Álvarez via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Dec 8 16:39:14 PST 2019


emilio created this revision.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.
emilio added a comment.
xbolva00 added reviewers: craig.topper, RKSimon.

Could I get some feedback on this? Does this look reasonable?


Even though llvm currently will sign-extend in the caller, this is not
guaranteed by the ABI, and thus the callee cannot assume it.

This fixes PR44228 and PR12207.

I still have a few tests to update, but I want to sanity-check this is
reasonable before doing so.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D71178

Files:
  llvm/lib/Target/X86/X86ISelLowering.cpp
  llvm/test/CodeGen/X86/addr-mode-matcher-2.ll
  llvm/test/CodeGen/X86/avx512-regcall-NoMask.ll
  llvm/test/CodeGen/X86/mask-negated-bool.ll
  llvm/test/CodeGen/X86/x86-64-arg.ll


Index: llvm/test/CodeGen/X86/x86-64-arg.ll
===================================================================
--- llvm/test/CodeGen/X86/x86-64-arg.ll
+++ /dev/null
@@ -1,15 +0,0 @@
-; RUN: llc < %s | grep "movl	%edi, %eax"
-; The input value is already sign extended, don't re-extend it.
-; This testcase corresponds to:
-;   int test(short X) { return (int)X; }
-
-target datalayout = "e-p:64:64"
-target triple = "x86_64-apple-darwin8"
-
-
-define i32 @test(i16 signext  %X) {
-entry:
-        %tmp12 = sext i16 %X to i32             ; <i32> [#uses=1]
-        ret i32 %tmp12
-}
-
Index: llvm/test/CodeGen/X86/mask-negated-bool.ll
===================================================================
--- llvm/test/CodeGen/X86/mask-negated-bool.ll
+++ llvm/test/CodeGen/X86/mask-negated-bool.ll
@@ -16,7 +16,7 @@
 define i32 @mask_negated_zext_bool2(i1 zeroext %x) {
 ; CHECK-LABEL: mask_negated_zext_bool2:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    movl %edi, %eax
+; CHECK-NEXT:    movzbl %dil, %eax
 ; CHECK-NEXT:    retq
   %ext = zext i1 %x to i32
   %neg = sub i32 0, %ext
@@ -50,7 +50,7 @@
 define i32 @mask_negated_sext_bool2(i1 zeroext %x) {
 ; CHECK-LABEL: mask_negated_sext_bool2:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    movl %edi, %eax
+; CHECK-NEXT:    movzbl %dil, %eax
 ; CHECK-NEXT:    retq
   %ext = sext i1 %x to i32
   %neg = sub i32 0, %ext
Index: llvm/test/CodeGen/X86/avx512-regcall-NoMask.ll
===================================================================
--- llvm/test/CodeGen/X86/avx512-regcall-NoMask.ll
+++ llvm/test/CodeGen/X86/avx512-regcall-NoMask.ll
@@ -1253,13 +1253,15 @@
 ; LINUXOSX64:       # %bb.0:
 ; LINUXOSX64-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
 ; LINUXOSX64-NEXT:    vaddsd %xmm0, %xmm1, %xmm0
+; LINUXOSX64-NEXT:    movsbl %al, %eax
 ; LINUXOSX64-NEXT:    vcvtsi2sd %eax, %xmm2, %xmm1
 ; LINUXOSX64-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
 ; LINUXOSX64-NEXT:    vcvtsi2sd %ecx, %xmm2, %xmm1
 ; LINUXOSX64-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
 ; LINUXOSX64-NEXT:    vcvtsi2sd %rdx, %xmm2, %xmm1
 ; LINUXOSX64-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
-; LINUXOSX64-NEXT:    vcvtsi2sd %edi, %xmm2, %xmm1
+; LINUXOSX64-NEXT:    movswl %di, %eax
+; LINUXOSX64-NEXT:    vcvtsi2sd %eax, %xmm2, %xmm1
 ; LINUXOSX64-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
 ; LINUXOSX64-NEXT:    vcvtsi2sdl (%rsi), %xmm2, %xmm1
 ; LINUXOSX64-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
Index: llvm/test/CodeGen/X86/addr-mode-matcher-2.ll
===================================================================
--- llvm/test/CodeGen/X86/addr-mode-matcher-2.ll
+++ llvm/test/CodeGen/X86/addr-mode-matcher-2.ll
@@ -42,7 +42,7 @@
 ; X64-LABEL: foo:
 ; X64:       # %bb.0:
 ; X64-NEXT:    pushq %rax
-; X64-NEXT:    testl %edi, %edi
+; X64-NEXT:    testb %dil, %dil
 ; X64-NEXT:    je .LBB0_1
 ; X64-NEXT:  # %bb.3:
 ; X64-NEXT:    popq %rax
Index: llvm/lib/Target/X86/X86ISelLowering.cpp
===================================================================
--- llvm/lib/Target/X86/X86ISelLowering.cpp
+++ llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -3352,16 +3352,7 @@
         ArgValue = DAG.getCopyFromReg(Chain, dl, Reg, RegVT);
       }
 
-      // If this is an 8 or 16-bit value, it is really passed promoted to 32
-      // bits.  Insert an assert[sz]ext to capture this, then truncate to the
-      // right size.
-      if (VA.getLocInfo() == CCValAssign::SExt)
-        ArgValue = DAG.getNode(ISD::AssertSext, dl, RegVT, ArgValue,
-                               DAG.getValueType(VA.getValVT()));
-      else if (VA.getLocInfo() == CCValAssign::ZExt)
-        ArgValue = DAG.getNode(ISD::AssertZext, dl, RegVT, ArgValue,
-                               DAG.getValueType(VA.getValVT()));
-      else if (VA.getLocInfo() == CCValAssign::BCvt)
+      if (VA.getLocInfo() == CCValAssign::BCvt)
         ArgValue = DAG.getBitcast(VA.getValVT(), ArgValue);
 
       if (VA.isExtInLoc()) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D71178.232748.patch
Type: text/x-patch
Size: 3889 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191209/d448e6ec/attachment.bin>


More information about the llvm-commits mailing list