From 790f2eb16a279f4cb4b57397fcafd5cadb49d6b7 Mon Sep 17 00:00:00 2001 From: Alex MacLean Date: Tue, 17 Sep 2024 15:31:28 -0700 Subject: [PATCH] [InstCombine] Avoid simplifying bitcast of undef to a zeroinitializer vector (#108872) In some cases, if an undef value is the product of another instcombine simplification, a bitcast of undef is simplified to a zeroinitializer vector instead of undef. --- .../InstCombine/InstCombineCasts.cpp | 5 ++++ llvm/test/Transforms/InstCombine/bitcast.ll | 23 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp index 5c9faa9449f539..ea51d779045718 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -2323,6 +2323,11 @@ static Value *optimizeIntegerToVectorInsertions(BitCastInst &CI, auto *DestVecTy = cast(CI.getType()); Value *IntInput = CI.getOperand(0); + // if the int input is just an undef value do not try to optimize to vector + // insertions as it will prevent undef propagation + if (isa(IntInput)) + return nullptr; + SmallVector Elements(DestVecTy->getNumElements()); if (!collectInsertionElements(IntInput, 0, Elements, DestVecTy->getElementType(), diff --git a/llvm/test/Transforms/InstCombine/bitcast.ll b/llvm/test/Transforms/InstCombine/bitcast.ll index 4ab24ce7b925dc..79e6370b7242f5 100644 --- a/llvm/test/Transforms/InstCombine/bitcast.ll +++ b/llvm/test/Transforms/InstCombine/bitcast.ll @@ -879,3 +879,26 @@ define half @copysign_idiom_constant_wrong_type2(bfloat %x, i16 %mag) { %y = bitcast i16 %res to half ret half %y } + +define i16 @bitcast_undef_to_vector() { +; CHECK-LABEL: @bitcast_undef_to_vector( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[END:%.*]] +; CHECK: unreachable: +; CHECK-NEXT: br label [[END]] +; CHECK: end: +; CHECK-NEXT: ret i16 undef +; +entry: + br label %end + +unreachable: ; No predecessors! + %0 = extractvalue { i32, i32 } zeroinitializer, 1 + br label %end + +end: ; preds = %unreachable, %entry + %1 = phi i32 [ %0, %unreachable ], [ undef, %entry ] + %2 = bitcast i32 %1 to <2 x i16> + %3 = extractelement <2 x i16> %2, i64 0 + ret i16 %3 +}