Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp =================================================================== --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -5751,7 +5751,9 @@ if (OpOpcode == ISD::UNDEF) return getUNDEF(VT); if (OpOpcode == ISD::VSCALE && !NewNodesMustHaveLegalTypes) - return getVScale(DL, VT, N1.getConstantOperandAPInt(0)); + return getVScale( + DL, VT, + N1.getConstantOperandAPInt(0).zextOrTrunc(VT.getScalarSizeInBits())); break; case ISD::ANY_EXTEND_VECTOR_INREG: case ISD::ZERO_EXTEND_VECTOR_INREG: Index: llvm/test/CodeGen/AArch64/sve-vscale.ll =================================================================== --- llvm/test/CodeGen/AArch64/sve-vscale.ll +++ llvm/test/CodeGen/AArch64/sve-vscale.ll @@ -101,6 +101,18 @@ ret i32 %1 } +define i1 @rdvl_i1() { +; CHECK-LABEL: rdvl_i1: +; CHECK: // %bb.0: +; CHECK-NEXT: rdvl x8, #-1 +; CHECK-NEXT: asr x8, x8, #4 +; CHECK-NEXT: and w0, w8, #0x1 +; CHECK-NEXT: ret + %a = tail call i64 @llvm.vscale.i64() + %b = trunc i64 %a to i1 + ret i1 %b +} + ; ; CNTH ;