diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp index 0c0e700f6abca..be5a8bb81ab65 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp @@ -6623,8 +6623,12 @@ SDValue DAGTypeLegalizer::WidenVecRes_SETCC(SDNode *N) { InOp1 = GetWidenedVector(InOp1); InOp2 = GetWidenedVector(InOp2); } else { - InOp1 = DAG.WidenVector(InOp1, SDLoc(N)); - InOp2 = DAG.WidenVector(InOp2, SDLoc(N)); + SDValue Poison = DAG.getPOISON(WidenInVT); + SDValue ZeroIdx = DAG.getVectorIdxConstant(0, SDLoc(N)); + InOp1 = DAG.getNode(ISD::INSERT_SUBVECTOR, SDLoc(N), WidenInVT, Poison, + InOp1, ZeroIdx); + InOp2 = DAG.getNode(ISD::INSERT_SUBVECTOR, SDLoc(N), WidenInVT, Poison, + InOp2, ZeroIdx); } // Assume that the input and output will be widen appropriately. If not, diff --git a/llvm/test/CodeGen/AArch64/arm64-neon-v1i1-setcc.ll b/llvm/test/CodeGen/AArch64/arm64-neon-v1i1-setcc.ll index 6c70d19a977a5..5ed362604dc5f 100644 --- a/llvm/test/CodeGen/AArch64/arm64-neon-v1i1-setcc.ll +++ b/llvm/test/CodeGen/AArch64/arm64-neon-v1i1-setcc.ll @@ -249,3 +249,19 @@ if.then: if.end: ret i32 1; } + +define <1 x i64> @test_zext_half(<1 x half> %v1) { +; CHECK-LABEL: test_zext_half: +; CHECK: // %bb.0: +; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0 +; CHECK-NEXT: mov w8, #1 // =0x1 +; CHECK-NEXT: fcvtl v0.4s, v0.4h +; CHECK-NEXT: fmov d1, x8 +; CHECK-NEXT: fcmgt v0.4s, v0.4s, #0.0 +; CHECK-NEXT: xtn v0.4h, v0.4s +; CHECK-NEXT: and v0.8b, v0.8b, v1.8b +; CHECK-NEXT: ret + %1 = fcmp ogt <1 x half> %v1, zeroinitializer + %2 = zext <1 x i1> %1 to <1 x i64> + ret <1 x i64> %2 +}