[llvm] [InstCombine] Avoid simplifying bitcast of undef to a zeroinitializer vector (PR #108872)
Alex MacLean via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 16 12:04:58 PDT 2024
https://github.com/AlexMaclean created https://github.com/llvm/llvm-project/pull/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.
>From c8b99acf7ac515d0e62740d7d135cfc3bbb43c82 Mon Sep 17 00:00:00 2001
From: Alex MacLean <amaclean at nvidia.com>
Date: Fri, 13 Sep 2024 18:16:58 +0000
Subject: [PATCH 1/2] pre-commit tests
---
llvm/test/Transforms/InstCombine/bitcast.ll | 25 +++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/llvm/test/Transforms/InstCombine/bitcast.ll b/llvm/test/Transforms/InstCombine/bitcast.ll
index 4ab24ce7b925dc..1e784574830e12 100644
--- a/llvm/test/Transforms/InstCombine/bitcast.ll
+++ b/llvm/test/Transforms/InstCombine/bitcast.ll
@@ -879,3 +879,28 @@ define half @copysign_idiom_constant_wrong_type2(bfloat %x, i16 %mag) {
%y = bitcast i16 %res to half
ret half %y
}
+
+define void @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: store i16 0, ptr addrspace(1) null, align 2
+; CHECK-NEXT: ret void
+;
+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
+ store i16 %3, ptr addrspace(1) null, align 2
+ ret void
+}
>From 55158a1c4bfbca8c6dc8255a453e957393b479be Mon Sep 17 00:00:00 2001
From: Alex MacLean <amaclean at nvidia.com>
Date: Fri, 13 Sep 2024 18:32:54 +0000
Subject: [PATCH 2/2] [InstCombine] Avoid simplifying bitcast of undef to a
zeroinitializer vector
---
llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp | 5 +++++
llvm/test/Transforms/InstCombine/bitcast.ll | 1 -
2 files changed, 5 insertions(+), 1 deletion(-)
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<FixedVectorType>(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<UndefValue>(IntInput))
+ return nullptr;
+
SmallVector<Value*, 8> 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 1e784574830e12..ee3bfd8acc2969 100644
--- a/llvm/test/Transforms/InstCombine/bitcast.ll
+++ b/llvm/test/Transforms/InstCombine/bitcast.ll
@@ -887,7 +887,6 @@ define void @bitcast_undef_to_vector() {
; CHECK: unreachable:
; CHECK-NEXT: br label [[END]]
; CHECK: end:
-; CHECK-NEXT: store i16 0, ptr addrspace(1) null, align 2
; CHECK-NEXT: ret void
;
entry:
More information about the llvm-commits
mailing list