[llvm] [SDAG] Intersect poison-generating flags after CSE (PR #114650)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Sat Nov 2 01:54:45 PDT 2024


https://github.com/dtcxzyw created https://github.com/llvm/llvm-project/pull/114650

This patch intersects poison-generating flags after CSE to fix assertion failure reported in https://github.com/llvm/llvm-project/pull/112354#issuecomment-2452369552.
It is an alternative to https://github.com/llvm/llvm-project/pull/114582.

Co-authored-by: Antonio Frighetto <me at antoniofrighetto.com>


>From 29246a92aee87e86cbc2bb64ee520d7385644f34 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Sat, 2 Nov 2024 16:43:01 +0800
Subject: [PATCH] [SDAG] Drop poison-generating flags after CSE

Co-authored-by: Antonio Frighetto <me at antoniofrighetto.com>
---
 .../lib/CodeGen/SelectionDAG/SelectionDAG.cpp |  8 +++++--
 .../ARM/dagcombine-drop-flags-freeze.ll       | 23 +++++++++++++++++++
 2 files changed, 29 insertions(+), 2 deletions(-)
 create mode 100644 llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll

diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index d5cdd7163d7910..166b6dbf46db87 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -10318,8 +10318,10 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
     AddNodeIDNode(ID, Opcode, VTs, Ops);
     void *IP = nullptr;
 
-    if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
+    if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
+      E->intersectFlagsWith(Flags);
       return SDValue(E, 0);
+    }
 
     N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
     createOperands(N, Ops);
@@ -10524,8 +10526,10 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
     FoldingSetNodeID ID;
     AddNodeIDNode(ID, Opcode, VTList, Ops);
     void *IP = nullptr;
-    if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
+    if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
+      E->intersectFlagsWith(Flags);
       return SDValue(E, 0);
+    }
 
     N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
     createOperands(N, Ops);
diff --git a/llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll b/llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll
new file mode 100644
index 00000000000000..63e16b03caee6b
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll
@@ -0,0 +1,23 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=arm-eabi -o - %s | FileCheck %s
+
+; Ensure poison-generating flags are stripped by the time a freeze operand is visited.
+
+define i1 @drop_flags(i32 noundef %numentries, i64 %cond, i64 %arg) {
+; CHECK-LABEL: drop_flags:
+; CHECK:       @ %bb.0: @ %entry
+; CHECK-NEXT:    ldm sp, {r1, r12}
+; CHECK-NEXT:    subs r1, r2, r1
+; CHECK-NEXT:    sbcs r1, r3, r12
+; CHECK-NEXT:    movlo r0, r2
+; CHECK-NEXT:    rsbs r1, r0, #0
+; CHECK-NEXT:    adc r0, r0, r1
+; CHECK-NEXT:    mov pc, lr
+entry:
+  %cmp4 = icmp samesign ult i64 %cond, %arg
+  %conv6 = trunc nuw i64 %cond to i32
+  %spec.select = select i1 %cmp4, i32 %conv6, i32 %numentries
+  %spec.select.fr = freeze i32 %spec.select
+  %cmpz = icmp eq i32 %spec.select.fr, 0
+  ret i1 %cmpz
+}



More information about the llvm-commits mailing list