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..1a3cffb126d51 --- /dev/null +++ b/llvm/test/CodeGen/ARM/dagcombine-drop-flags-freeze.ll @@ -0,0 +1,25 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; 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. + +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: clz r0, r0 +; CHECK-NEXT: lsr r0, r0, #5 +; CHECK-NEXT: bx 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 +} + +declare i32 @llvm.ctlz.i32(i32, i1)