From af4c1716b8edd9fefb6732614b4f1a62dc266af3 Mon Sep 17 00:00:00 2001 From: Antonio Frighetto Date: Fri, 1 Nov 2024 18:36:32 +0100 Subject: [PATCH 1/4] [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 7eef09e55101d..c24ab99d75de6 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 0000000000000..fbb3feee67b29 --- /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. + +@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 Date: Fri, 1 Nov 2024 18:54:04 +0100 Subject: [PATCH 2/4] !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 fbb3feee67b29..879a28b119b49 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 Date: Fri, 1 Nov 2024 19:00:37 +0100 Subject: [PATCH 3/4] !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 879a28b119b49..35c8eb25eda42 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. From 1c5a0fcb54e925e979032e0e81a1f145bffd51a1 Mon Sep 17 00:00:00 2001 From: Antonio Frighetto Date: Fri, 1 Nov 2024 19:31:08 +0100 Subject: [PATCH 4/4] !fixup simplify test --- .../ARM/dagcombine-drop-flags-freeze.ll | 23 ++++--------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll b/llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll index 35c8eb25eda42..1a3cffb126d51 100644 --- a/llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll +++ b/llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll @@ -3,38 +3,23 @@ ; Ensure poison-generating flags are stripped by the time a freeze operand is visited. -@g_ptr = global ptr null, align 4 - -define ptr @drop_flags(i32 noundef %numentries, i64 %cond, i64 %arg) { +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: cmp r0, #0 -; CHECK-NEXT: ldr r0, .LCPI0_0 -; CHECK-NEXT: ldr r0, [r0] +; CHECK-NEXT: clz r0, r0 +; CHECK-NEXT: lsr r0, r0, #5 ; 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 + ret i1 %cmpz } declare i32 @llvm.ctlz.i32(i32, i1)