https://github.com/llvmbot updated https://github.com/llvm/llvm-project/pull/128283
>From 69ee30f9db773048d314db466aaa187b6843c3c0 Mon Sep 17 00:00:00 2001 From: Yingwei Zheng <dtcxzyw2...@gmail.com> Date: Sat, 22 Feb 2025 12:06:34 +0800 Subject: [PATCH] [DAGCombiner] visitFREEZE: Early exit when N is deleted (#128161) `N` may get merged with existing nodes inside the loop. Early exit when it is deleted to avoid the crash. Alternative solution: use `DAGNodeDeletedListener` to refresh the value of N. Closes https://github.com/llvm/llvm-project/issues/128143. (cherry picked from commit 646e4f2eede9a39e46012dde9430cd289682e83c) --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 8 +++-- llvm/test/CodeGen/X86/pr128143.ll | 32 +++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 llvm/test/CodeGen/X86/pr128143.ll diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index a0c703d2df8a2..1e023d4f76b2c 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -16170,11 +16170,13 @@ SDValue DAGCombiner::visitFREEZE(SDNode *N) { DAG.UpdateNodeOperands(FrozenMaybePoisonOperand.getNode(), MaybePoisonOperand); } + + // This node has been merged with another. + if (N->getOpcode() == ISD::DELETED_NODE) + return SDValue(N, 0); } - // This node has been merged with another. - if (N->getOpcode() == ISD::DELETED_NODE) - return SDValue(N, 0); + assert(N->getOpcode() != ISD::DELETED_NODE && "Node was deleted!"); // The whole node may have been updated, so the value we were holding // may no longer be valid. Re-fetch the operand we're `freeze`ing. diff --git a/llvm/test/CodeGen/X86/pr128143.ll b/llvm/test/CodeGen/X86/pr128143.ll new file mode 100644 index 0000000000000..2517ad9ebcb6b --- /dev/null +++ b/llvm/test/CodeGen/X86/pr128143.ll @@ -0,0 +1,32 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s + +@g_1 = external global i8 +@g_2 = external global i8 + +; Make sure we don't crash on this test. + +define i1 @test(i1 %cmp1, i32 %x) { +; CHECK-LABEL: test: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: movq g_2@GOTPCREL(%rip), %rcx +; CHECK-NEXT: xorl %eax, %eax +; CHECK-NEXT: cmpq %rcx, g_1@GOTPCREL(%rip) +; CHECK-NEXT: setne %al +; CHECK-NEXT: cmpl %eax, %esi +; CHECK-NEXT: setb %cl +; CHECK-NEXT: orb %cl, %al +; CHECK-NEXT: andb %dil, %al +; CHECK-NEXT: # kill: def $al killed $al killed $eax +; CHECK-NEXT: retq +entry: + %cmp2 = icmp ne ptr @g_1, @g_2 + %fr = freeze ptr @g_1 + %cmp3 = icmp ne ptr %fr, @g_2 + %ext1 = zext i1 %cmp3 to i32 + %sel1 = select i1 %cmp1, i1 %cmp2, i1 false + %cmp4 = icmp ult i32 %x, %ext1 + %sel3 = select i1 %cmp1, i1 %cmp4, i1 false + %or = or i1 %sel1, %sel3 + ret i1 %or +} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits