Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp =================================================================== --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -14351,6 +14351,9 @@ Op = DAG.getFreeze(Op); } // NOTE: this strips poison generating flags. + if(N0.getOpcode() == ISD::DELETED_NODE){ + return SDValue(); + } SDValue R = DAG.getNode(N0.getOpcode(), SDLoc(N0), N0->getVTList(), Ops); assert(DAG.isGuaranteedNotToBeUndefOrPoison(R, /*PoisonOnly*/ false) && "Can't create node that may be undef/poison!"); Index: llvm/test/CodeGen/AArch64/dagcombine-deleted-freeze.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/AArch64/dagcombine-deleted-freeze.ll @@ -0,0 +1,19 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc < %s -mtriple=aarch64 | FileCheck %s +target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" +target triple = "aarch64-linux-gnu" + +define i8 @f(i64 %0) { +; CHECK-LABEL: f: +; CHECK: // %bb.0: +; CHECK-NEXT: eor w8, w0, w0 +; CHECK-NEXT: and w0, w8, #0x1 +; CHECK-NEXT: ret + %2 = freeze i64 %0 + %3 = trunc i64 %2 to i1 + %4 = trunc i64 %0 to i1 + %5 = xor i1 %3, %4 + %6 = freeze i1 %5 + %7 = zext i1 %6 to i8 + ret i8 %7 +}