diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -8361,8 +8361,8 @@ unsigned LowBits = OpSizeInBits - (unsigned)N1C->getZExtValue(); EVT ExtVT = EVT::getIntegerVT(*DAG.getContext(), LowBits); if (VT.isVector()) - ExtVT = EVT::getVectorVT(*DAG.getContext(), - ExtVT, VT.getVectorNumElements()); + ExtVT = EVT::getVectorVT(*DAG.getContext(), ExtVT, + VT.getVectorElementCount()); if (!LegalOperations || TLI.getOperationAction(ISD::SIGN_EXTEND_INREG, ExtVT) == TargetLowering::Legal) @@ -8416,7 +8416,7 @@ EVT TruncVT = EVT::getIntegerVT(Ctx, OpSizeInBits - N1C->getZExtValue()); if (VT.isVector()) - TruncVT = EVT::getVectorVT(Ctx, TruncVT, VT.getVectorNumElements()); + TruncVT = EVT::getVectorVT(Ctx, TruncVT, VT.getVectorElementCount()); // Determine the residual right-shift amount. int ShiftAmt = N1C->getZExtValue() - N01C->getZExtValue(); @@ -8456,7 +8456,7 @@ unsigned ShiftAmt = N1C->getZExtValue(); EVT TruncVT = EVT::getIntegerVT(Ctx, OpSizeInBits - ShiftAmt); if (VT.isVector()) - TruncVT = EVT::getVectorVT(Ctx, TruncVT, VT.getVectorNumElements()); + TruncVT = EVT::getVectorVT(Ctx, TruncVT, VT.getVectorElementCount()); // TODO: The simple type check probably belongs in the default hook // implementation and/or target-specific overrides (because diff --git a/llvm/test/CodeGen/AArch64/DAGCombine_vscale.ll b/llvm/test/CodeGen/AArch64/DAGCombine_vscale.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/DAGCombine_vscale.ll @@ -0,0 +1,70 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s 2>%t | FileCheck %s +; RUN: FileCheck --check-prefix=WARN --allow-empty %s <%t + +; WARN-NOT: warning + +; Check that DAGCombiner is not asserting with mis-matched vector element count, "Vector element counts must match in SIGN_EXTEND_INREG". +; Also no warning message of "warning: Possible incorrect use of EVT::getVectorNumElements() for scalable vector.". + +define @sext_inreg( %a) { +; CHECK-LABEL: sext_inreg: +; CHECK: // %bb.0: +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: sxth z0.s, p0/m, z0.s +; CHECK-NEXT: ret + %in = insertelement undef, i32 16, i32 0 + %splat = shufflevector %in, undef, zeroinitializer + %sext = shl %a, %splat + %conv = ashr %sext, %splat + ret %conv +} + +define @ashr_shl( %a) { +; CHECK-LABEL: ashr_shl: +; CHECK: // %bb.0: +; CHECK-NEXT: lsl z0.s, z0.s, #8 +; CHECK-NEXT: asr z0.s, z0.s, #16 +; CHECK-NEXT: ret + %in1 = insertelement undef, i32 8, i32 0 + %splat1 = shufflevector %in1, undef, zeroinitializer + %in2 = insertelement undef, i32 16, i32 0 + %splat2 = shufflevector %in2, undef, zeroinitializer + %shl = shl %a, %splat1 + %r = ashr %shl, %splat2 + ret %r +} + +define @ashr_shl_illegal_trunc_vec_ty( %a) { +; CHECK-LABEL: ashr_shl_illegal_trunc_vec_ty: +; CHECK: // %bb.0: +; CHECK-NEXT: lsl z0.s, z0.s, #8 +; CHECK-NEXT: asr z0.s, z0.s, #11 +; CHECK-NEXT: ret + %in1 = insertelement undef, i32 8, i32 0 + %splat1 = shufflevector %in1, undef, zeroinitializer + %in2 = insertelement undef, i32 11, i32 0 + %splat2 = shufflevector %in2, undef, zeroinitializer + %shl = shl %a, %splat1 + %r = ashr %shl, %splat2 + ret %r +} + +define @ashr_add_shl_nxv4i8( %a) { +; CHECK-LABEL: ashr_add_shl_nxv4i8: +; CHECK: // %bb.0: +; CHECK-NEXT: mov w8, #16777216 +; CHECK-NEXT: mov z1.s, w8 +; CHECK-NEXT: lsl z0.s, z0.s, #24 +; CHECK-NEXT: add z0.s, z0.s, z1.s +; CHECK-NEXT: asr z0.s, z0.s, #24 +; CHECK-NEXT: ret + %in1 = insertelement undef, i32 24, i32 0 + %splat1 = shufflevector %in1, undef, zeroinitializer + %in2 = insertelement undef, i32 16777216, i32 0 + %splat2 = shufflevector %in2, undef, zeroinitializer + %conv = shl %a, %splat1 + %sext = add %conv, %splat2 + %conv1 = ashr %sext, %splat1 + ret %conv1 +}