[llvm] [DAGCombine] Fix miscompilation caused by PR94008 (PR #94850)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Sat Jun 8 03:52:25 PDT 2024
https://github.com/dtcxzyw created https://github.com/llvm/llvm-project/pull/94850
The pr description in #94008 mismatches with the code.
> + When VT is smaller than ShiftVT, it is safe to use trunc.
> + When VT is larger than ShiftVT, it is safe to use zext iff
`is_zero_poison` is true (i.e., `opcode == ISD::CTTZ_ZERO_UNDEF`). See
also the counterexample `src_shl_cttz2 -> tgt_shl_cttz2` in the alive2
proofs.
Closes #94824.
>From 9e1506c64367f5a2935066910d854098d5446c8e Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
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 <dtcxzyw2333 at gmail.com>
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:
More information about the llvm-commits
mailing list