[llvm] [DAGCombiner] Ensure poison-generating flags are stripped in `freeze` op (PR #114582)

Antonio Frighetto via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 1 11:01:14 PDT 2024


https://github.com/antoniofrighetto updated https://github.com/llvm/llvm-project/pull/114582

>From af4c1716b8edd9fefb6732614b4f1a62dc266af3 Mon Sep 17 00:00:00 2001
From: Antonio Frighetto <me at antoniofrighetto.com>
Date: Fri, 1 Nov 2024 18:36:32 +0100
Subject: [PATCH 1/3] [DAGCombiner] Ensure poison-generating flags are stripped
 in `freeze` op

When combining `freeze` in DAG, poison-generating flags were previously
not fully removed as intended. This change explicitly drops these flags
from `freeze` operand, ensuring a fixed, non-poisonous value at this
point in computation.
---
 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp |  1 +
 .../ARM/dagcombine-drop-flags-freeze.ll       | 40 +++++++++++++++++++
 2 files changed, 41 insertions(+)
 create mode 100644 llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll

diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 7eef09e55101d0..c24ab99d75de65 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -16151,6 +16151,7 @@ SDValue DAGCombiner::visitFREEZE(SDNode *N) {
                              SVN->getMask());
   } else {
     // NOTE: this strips poison generating flags.
+    N0->dropFlags(SDNodeFlags::PoisonGeneratingFlags);
     R = DAG.getNode(N0.getOpcode(), SDLoc(N0), N0->getVTList(), Ops);
   }
   assert(DAG.isGuaranteedNotToBeUndefOrPoison(R, /*PoisonOnly*/ false) &&
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..fbb3feee67b29b
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll
@@ -0,0 +1,40 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=arm-linux-gnueabi -mcpu=arm1022e -mattr=armv5te -o - %s | FileCheck %s
+
+; Ensure poison-generating flags are stripped by the time a freeze operand is visited.
+
+ at g_ptr = global ptr null, align 4
+
+define ptr @drop_flags(i32 noundef %numentries, i64 %cond, i64 %arg) local_unnamed_addr #0 {
+; 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:    cmp r0, #0
+; CHECK-NEXT:    ldr r0, .LCPI0_0
+; CHECK-NEXT:    ldr r0, [r0]
+; CHECK-NEXT:    bx lr
+; CHECK-NEXT:    .p2align 2
+; CHECK-NEXT:  @ %bb.1:
+; CHECK-NEXT:  .LCPI0_0:
+; CHECK-NEXT:    .long g_ptr
+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
+  br i1 %cmpz, label %bb.end, label %bb.false
+
+bb.false:                                       ; preds = %entry
+  %2 = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 %spec.select.fr, i1 true)
+  br label %bb.end
+
+bb.end:                                         ; preds = %entry, %bb.false
+  %3 = load ptr, ptr @g_ptr, align 4
+  ret ptr %3
+}
+
+declare i32 @llvm.ctlz.i32(i32, i1)

>From f731a7258ad237e830b4e24dad4614decad859fa Mon Sep 17 00:00:00 2001
From: Antonio Frighetto <me at antoniofrighetto.com>
Date: Fri, 1 Nov 2024 18:54:04 +0100
Subject: [PATCH 2/3] !fixup drop dead attribute

---
 llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll b/llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll
index fbb3feee67b29b..879a28b119b492 100644
--- a/llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll
+++ b/llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll
@@ -5,7 +5,7 @@
 
 @g_ptr = global ptr null, align 4
 
-define ptr @drop_flags(i32 noundef %numentries, i64 %cond, i64 %arg) local_unnamed_addr #0 {
+define ptr @drop_flags(i32 noundef %numentries, i64 %cond, i64 %arg) {
 ; CHECK-LABEL: drop_flags:
 ; CHECK:       @ %bb.0: @ %entry
 ; CHECK-NEXT:    ldm sp, {r1, r12}

>From 0c5e0a2d10e43564df8ac31fb8ae943503235312 Mon Sep 17 00:00:00 2001
From: Antonio Frighetto <me at antoniofrighetto.com>
Date: Fri, 1 Nov 2024 19:00:37 +0100
Subject: [PATCH 3/3] !fixup drop -mattr

---
 llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll b/llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll
index 879a28b119b492..35c8eb25eda421 100644
--- a/llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll
+++ b/llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll
@@ -1,5 +1,5 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
-; RUN: llc -mtriple=arm-linux-gnueabi -mcpu=arm1022e -mattr=armv5te -o - %s | FileCheck %s
+; RUN: llc -mtriple=arm-linux-gnueabi -mcpu=arm1022e -o - %s | FileCheck %s
 
 ; Ensure poison-generating flags are stripped by the time a freeze operand is visited.
 



More information about the llvm-commits mailing list