[PATCH] D43445: [X86] Improve getScalarShiftAmountTy handling of illegal integer types (PR36250)

Simon Pilgrim via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Feb 18 10:15:12 PST 2018


RKSimon created this revision.
RKSimon added reviewers: craig.topper, efriedma, spatel.

X86TargetLowering::getScalarShiftAmountTy returns MVT::i8 for all types, which will cause assertions for illegal integer types that are larger than i256

This patch adds a fallback to the generic TargetLowering::getScalarShiftAmountTy implementation for types that require large shift types, which will generate valid code until we legalize types/ops.


Repository:
  rL LLVM

https://reviews.llvm.org/D43445

Files:
  lib/Target/X86/X86ISelLowering.h
  test/CodeGen/X86/legalize-shift.ll


Index: test/CodeGen/X86/legalize-shift.ll
===================================================================
--- test/CodeGen/X86/legalize-shift.ll
+++ test/CodeGen/X86/legalize-shift.ll
@@ -0,0 +1,37 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefix=X86
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=X64
+
+define void @PR36250() {
+; X86-LABEL: PR36250:
+; X86:       # %bb.0:
+; X86-NEXT:    movl (%eax), %eax
+; X86-NEXT:    movl %eax, %ecx
+; X86-NEXT:    roll %ecx
+; X86-NEXT:    addl %eax, %eax
+; X86-NEXT:    movl %ecx, %edx
+; X86-NEXT:    orl %edx, %edx
+; X86-NEXT:    orl %ecx, %edx
+; X86-NEXT:    orl %eax, %edx
+; X86-NEXT:    orl %ecx, %edx
+; X86-NEXT:    sete (%eax)
+; X86-NEXT:    retl
+;
+; X64-LABEL: PR36250:
+; X64:       # %bb.0:
+; X64-NEXT:    movq (%rax), %rax
+; X64-NEXT:    movq %rax, %rcx
+; X64-NEXT:    rolq %rcx
+; X64-NEXT:    addq %rax, %rax
+; X64-NEXT:    movq %rcx, %rdx
+; X64-NEXT:    orq %rdx, %rdx
+; X64-NEXT:    orq %rax, %rdx
+; X64-NEXT:    orq %rcx, %rdx
+; X64-NEXT:    sete (%rax)
+; X64-NEXT:    retq
+   %1 = load i448, i448* undef
+   %2 = sub i448 0, %1
+   %3 = icmp eq i448 %1, %2
+   store i1 %3, i1* undef
+   ret void
+}
Index: lib/Target/X86/X86ISelLowering.h
===================================================================
--- lib/Target/X86/X86ISelLowering.h
+++ lib/Target/X86/X86ISelLowering.h
@@ -681,8 +681,10 @@
     void markLibCallAttributes(MachineFunction *MF, unsigned CC,
                                ArgListTy &Args) const override;
 
-    MVT getScalarShiftAmountTy(const DataLayout &, EVT VT) const override {
-      return MVT::i8;
+    MVT getScalarShiftAmountTy(const DataLayout &DL, EVT VT) const override {
+      if (isTypeLegal(VT) || (8 >= Log2_32_Ceil(VT.getScalarSizeInBits())))
+        return MVT::i8;
+      return TargetLowering::getScalarShiftAmountTy(DL, VT);
     }
 
     const MCExpr *


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D43445.134840.patch
Type: text/x-patch
Size: 2083 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180218/c876f383/attachment.bin>


More information about the llvm-commits mailing list