diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 5d739b84d26132..4883b4b4447785 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -6252,7 +6252,8 @@ SDValue DAGCombiner::visitAND(SDNode *N) { // This can be a pure constant or a vector splat, in which case we treat the // vector as a scalar and use the splat value. APInt Constant = APInt::getZero(1); - if (const ConstantSDNode *C = isConstOrConstSplat(N1)) { + if (const ConstantSDNode *C = isConstOrConstSplat( + N1, /*AllowUndef=*/false, /*AllowTruncation=*/true)) { Constant = C->getAPIntValue(); } else if (BuildVectorSDNode *Vector = dyn_cast(N1)) { APInt SplatValue, SplatUndef; diff --git a/llvm/test/CodeGen/AArch64/sve-extload-icmp.ll b/llvm/test/CodeGen/AArch64/sve-extload-icmp.ll new file mode 100644 index 00000000000000..ad3e0b58028a68 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/sve-extload-icmp.ll @@ -0,0 +1,99 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc < %s | FileCheck %s + +target triple = "aarch64-unknown-linux-gnu" + +define @extload_icmp_nxv8i8(ptr %in) #0 { +; CHECK-LABEL: extload_icmp_nxv8i8: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: ld1b { z0.h }, p0/z, [x0] +; CHECK-NEXT: cnot z0.h, p0/m, z0.h +; CHECK-NEXT: ret + %ld = load , ptr %in + %cmp = icmp eq %ld, zeroinitializer + %ex = zext %cmp to + ret %ex +} + +define @extload_icmp_nxv16i8(ptr %in) #0 { +; CHECK-LABEL: extload_icmp_nxv16i8: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p0.b +; CHECK-NEXT: ld1b { z0.b }, p0/z, [x0] +; CHECK-NEXT: cnot z0.b, p0/m, z0.b +; CHECK-NEXT: ret + %ld = load , ptr %in + %cmp = icmp eq %ld, zeroinitializer + %ex = zext %cmp to + ret %ex +} + +define @extload_icmp_nxv4i16(ptr %in) #0 { +; CHECK-LABEL: extload_icmp_nxv4i16: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: ld1h { z0.s }, p0/z, [x0] +; CHECK-NEXT: cnot z0.s, p0/m, z0.s +; CHECK-NEXT: ret + %ld = load , ptr %in + %cmp = icmp eq %ld, zeroinitializer + %ex = zext %cmp to + ret %ex +} + +define @extload_icmp_nxv8i16(ptr %in) #0 { +; CHECK-LABEL: extload_icmp_nxv8i16: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: ld1h { z0.h }, p0/z, [x0] +; CHECK-NEXT: cnot z0.h, p0/m, z0.h +; CHECK-NEXT: ret + %ld = load , ptr %in + %cmp = icmp eq %ld, zeroinitializer + %ex = zext %cmp to + ret %ex +} + +define @extload_icmp_nxv2i32(ptr %in) #0 { +; CHECK-LABEL: extload_icmp_nxv2i32: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: ld1w { z0.d }, p0/z, [x0] +; CHECK-NEXT: cnot z0.d, p0/m, z0.d +; CHECK-NEXT: ret + %ld = load , ptr %in + %cmp = icmp eq %ld, zeroinitializer + %ex = zext %cmp to + ret %ex +} + +define @extload_icmp_nxv4i32(ptr %in) #0 { +; CHECK-LABEL: extload_icmp_nxv4i32: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: ld1w { z0.s }, p0/z, [x0] +; CHECK-NEXT: cnot z0.s, p0/m, z0.s +; CHECK-NEXT: ret + %ld = load , ptr %in + %cmp = icmp eq %ld, zeroinitializer + %ex = zext %cmp to + ret %ex +} + +define @extload_icmp_nxv2i64(ptr %in) #0 { +; CHECK-LABEL: extload_icmp_nxv2i64: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0] +; CHECK-NEXT: cnot z0.d, p0/m, z0.d +; CHECK-NEXT: ret + %ld = load , ptr %in + %cmp = icmp eq %ld, zeroinitializer + %ex = zext %cmp to + ret %ex +} + + + +attributes #0 = { "target-features"="+sve" }