Skip to content

Commit af4c171

Browse files
[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.
1 parent ea33af6 commit af4c171

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16151,6 +16151,7 @@ SDValue DAGCombiner::visitFREEZE(SDNode *N) {
1615116151
SVN->getMask());
1615216152
} else {
1615316153
// NOTE: this strips poison generating flags.
16154+
N0->dropFlags(SDNodeFlags::PoisonGeneratingFlags);
1615416155
R = DAG.getNode(N0.getOpcode(), SDLoc(N0), N0->getVTList(), Ops);
1615516156
}
1615616157
assert(DAG.isGuaranteedNotToBeUndefOrPoison(R, /*PoisonOnly*/ false) &&
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple=arm-linux-gnueabi -mcpu=arm1022e -mattr=armv5te -o - %s | FileCheck %s
3+
4+
; Ensure poison-generating flags are stripped by the time a freeze operand is visited.
5+
6+
@g_ptr = global ptr null, align 4
7+
8+
define ptr @drop_flags(i32 noundef %numentries, i64 %cond, i64 %arg) local_unnamed_addr #0 {
9+
; CHECK-LABEL: drop_flags:
10+
; CHECK: @ %bb.0: @ %entry
11+
; CHECK-NEXT: ldm sp, {r1, r12}
12+
; CHECK-NEXT: subs r1, r2, r1
13+
; CHECK-NEXT: sbcs r1, r3, r12
14+
; CHECK-NEXT: movlo r0, r2
15+
; CHECK-NEXT: cmp r0, #0
16+
; CHECK-NEXT: ldr r0, .LCPI0_0
17+
; CHECK-NEXT: ldr r0, [r0]
18+
; CHECK-NEXT: bx lr
19+
; CHECK-NEXT: .p2align 2
20+
; CHECK-NEXT: @ %bb.1:
21+
; CHECK-NEXT: .LCPI0_0:
22+
; CHECK-NEXT: .long g_ptr
23+
entry:
24+
%cmp4 = icmp samesign ult i64 %cond, %arg
25+
%conv6 = trunc nuw i64 %cond to i32
26+
%spec.select = select i1 %cmp4, i32 %conv6, i32 %numentries
27+
%spec.select.fr = freeze i32 %spec.select
28+
%cmpz = icmp eq i32 %spec.select.fr, 0
29+
br i1 %cmpz, label %bb.end, label %bb.false
30+
31+
bb.false: ; preds = %entry
32+
%2 = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 %spec.select.fr, i1 true)
33+
br label %bb.end
34+
35+
bb.end: ; preds = %entry, %bb.false
36+
%3 = load ptr, ptr @g_ptr, align 4
37+
ret ptr %3
38+
}
39+
40+
declare i32 @llvm.ctlz.i32(i32, i1)

0 commit comments

Comments
 (0)