From 9e1506c64367f5a2935066910d854098d5446c8e Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Sat, 8 Jun 2024 18:36:36 +0800 Subject: [PATCH 1/2] [DAGCombine][X86] Add pre-commit tests from PR94824. NFC. --- llvm/test/CodeGen/X86/pr94824.ll | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 llvm/test/CodeGen/X86/pr94824.ll diff --git a/llvm/test/CodeGen/X86/pr94824.ll b/llvm/test/CodeGen/X86/pr94824.ll new file mode 100644 index 0000000000000..fbc0d1250a9cb --- /dev/null +++ b/llvm/test/CodeGen/X86/pr94824.ll @@ -0,0 +1,18 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck %s + +define i16 @pr94824(i8 %x1) { +; CHECK-LABEL: pr94824: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: movl %edi, %eax +; CHECK-NEXT: negb %al +; CHECK-NEXT: andb %dil, %al +; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: # kill: def $ax killed $ax killed $eax +; CHECK-NEXT: retq +entry: + %cttz = call i8 @llvm.cttz.i8(i8 %x1, i1 false) + %ext = zext i8 %cttz to i16 + %shl = shl i16 1, %ext + ret i16 %shl +} From cf49f7e5c827d8531da93b55a943e1f3bd39770e Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Sat, 8 Jun 2024 18:47:08 +0800 Subject: [PATCH 2/2] [DAGCombine] Fix miscompilation caused by PR94008. --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 2 +- llvm/test/CodeGen/X86/pr94824.ll | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 9a5359015439e..1130a1ae20445 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -10117,7 +10117,7 @@ SDValue DAGCombiner::visitSHL(SDNode *N) { // fold (shl X, cttz(Y)) -> (mul (Y & -Y), X) if cttz is unsupported on the // target. if (((N1.getOpcode() == ISD::CTTZ && - VT.getScalarSizeInBits() >= ShiftVT.getScalarSizeInBits()) || + VT.getScalarSizeInBits() <= ShiftVT.getScalarSizeInBits()) || N1.getOpcode() == ISD::CTTZ_ZERO_UNDEF) && N1.hasOneUse() && !TLI.isOperationLegalOrCustom(ISD::CTTZ, ShiftVT) && TLI.isOperationLegalOrCustom(ISD::MUL, VT)) { diff --git a/llvm/test/CodeGen/X86/pr94824.ll b/llvm/test/CodeGen/X86/pr94824.ll index fbc0d1250a9cb..7744d00acf3d4 100644 --- a/llvm/test/CodeGen/X86/pr94824.ll +++ b/llvm/test/CodeGen/X86/pr94824.ll @@ -4,10 +4,11 @@ define i16 @pr94824(i8 %x1) { ; CHECK-LABEL: pr94824: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movl %edi, %eax -; CHECK-NEXT: negb %al -; CHECK-NEXT: andb %dil, %al -; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: orl $256, %edi # imm = 0x100 +; CHECK-NEXT: rep bsfl %edi, %ecx +; CHECK-NEXT: movl $1, %eax +; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx +; CHECK-NEXT: shll %cl, %eax ; CHECK-NEXT: # kill: def $ax killed $ax killed $eax ; CHECK-NEXT: retq entry: