From: Dávid Bolvanský Date: Fri, 30 Apr 2021 22:41:44 +0000 (+0200) Subject: [X86] Promote 16-bit CTTZ_ZERO_UNDEF to 32-bit variant X-Git-Tag: llvmorg-14-init~7907 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2af95a527580333940333c532679356d99b88e3d;p=platform%2Fupstream%2Fllvm.git [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 --- diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index b3d0900..691398b 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 f8d0336..0c12135 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