[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