[llvm] 2af95a5 - [X86] Promote 16-bit CTTZ_ZERO_UNDEF to 32-bit variant
Dávid Bolvanský via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 30 15:42:26 PDT 2021
Author: Dávid Bolvanský
Date: 2021-05-01T00:42:15+02:00
New Revision: 2af95a527580333940333c532679356d99b88e3d
URL: https://github.com/llvm/llvm-project/commit/2af95a527580333940333c532679356d99b88e3d
DIFF: https://github.com/llvm/llvm-project/commit/2af95a527580333940333c532679356d99b88e3d.diff
LOG: [X86] Promote 16-bit CTTZ_ZERO_UNDEF to 32-bit variant
Related to PR50172.
Protects us against regressions after we will start doing cttz(zext(x)) -> zext(cttz(x)) transformation in the middle-end.
Reviewed By: craig.topper
Differential Revision: https://reviews.llvm.org/D101662
Added:
Modified:
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/clz.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index b3d0900ff0bb..691398bdccdd 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -364,8 +364,13 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
// encoding.
setOperationPromotedToType(ISD::CTTZ , MVT::i8 , MVT::i32);
setOperationPromotedToType(ISD::CTTZ_ZERO_UNDEF, MVT::i8 , MVT::i32);
- if (!Subtarget.hasBMI()) {
- setOperationAction(ISD::CTTZ , MVT::i16 , Custom);
+
+ if (Subtarget.hasBMI()) {
+ // Promote the i16 zero undef variant and force it on up to i32 when tzcnt
+ // is enabled.
+ setOperationPromotedToType(ISD::CTTZ_ZERO_UNDEF, MVT::i16, MVT::i32);
+ } else {
+ setOperationAction(ISD::CTTZ, MVT::i16, Custom);
setOperationAction(ISD::CTTZ , MVT::i32 , Custom);
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i16 , Legal);
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i32 , Legal);
diff --git a/llvm/test/CodeGen/X86/clz.ll b/llvm/test/CodeGen/X86/clz.ll
index f8d03362d19d..0c12135c127f 100644
--- a/llvm/test/CodeGen/X86/clz.ll
+++ b/llvm/test/CodeGen/X86/clz.ll
@@ -56,12 +56,14 @@ define i16 @cttz_i16(i16 %x) {
;
; X86-CLZ-LABEL: cttz_i16:
; X86-CLZ: # %bb.0:
-; X86-CLZ-NEXT: tzcntw {{[0-9]+}}(%esp), %ax
+; X86-CLZ-NEXT: tzcntl {{[0-9]+}}(%esp), %eax
+; X86-CLZ-NEXT: # kill: def $ax killed $ax killed $eax
; X86-CLZ-NEXT: retl
;
; X64-CLZ-LABEL: cttz_i16:
; X64-CLZ: # %bb.0:
-; X64-CLZ-NEXT: tzcntw %di, %ax
+; X64-CLZ-NEXT: tzcntl %edi, %eax
+; X64-CLZ-NEXT: # kill: def $ax killed $ax killed $eax
; X64-CLZ-NEXT: retq
%tmp = call i16 @llvm.cttz.i16( i16 %x, i1 true )
ret i16 %tmp
More information about the llvm-commits
mailing list