[PATCH] D143886: [DAG] Handle build_vector with all undefs in reduceBuildVecTruncToBitCast
Pierre van Houtryve via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 13 01:20:32 PST 2023
Pierre-vh created this revision.
Pierre-vh added reviewers: arsenm, foad.
Herald added subscribers: kosarev, StephenFan, ecnelises, kerbowa, hiraditya, jvesely.
Herald added a project: All.
Pierre-vh requested review of this revision.
Herald added subscribers: llvm-commits, wdng.
Herald added a project: LLVM.
While working on D143731 <https://reviews.llvm.org/D143731> I hit a case where a build_vector with 2 undef operands could be generated (with one undef hidden behind a bitcast).
That made `reduceBuildVecTruncToBitCast` crash because it seems to assume there is at least one good operand.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D143886
Files:
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
llvm/test/CodeGen/AMDGPU/amdgcn.bitcast.ll
Index: llvm/test/CodeGen/AMDGPU/amdgcn.bitcast.ll
===================================================================
--- llvm/test/CodeGen/AMDGPU/amdgcn.bitcast.ll
+++ llvm/test/CodeGen/AMDGPU/amdgcn.bitcast.ll
@@ -856,3 +856,65 @@
store <30 x i32> %phi_cast, ptr addrspace(1) %out
ret void
}
+
+define amdgpu_kernel void @bitcast_large_phis_broken(i32 %cond, ptr addrspace(1) %out, <4 x i64> %value) {
+entry:
+ %cmp0 = icmp eq i32 %cond, 0
+ %0 = call <2 x i16> @llvm.vector.extract.v2i16.v16i16(<16 x i16> zeroinitializer, i64 0)
+ %1 = call <2 x i16> @llvm.vector.extract.v2i16.v16i16(<16 x i16> zeroinitializer, i64 2)
+ %2 = call <2 x i16> @llvm.vector.extract.v2i16.v16i16(<16 x i16> zeroinitializer, i64 4)
+ %3 = call <2 x i16> @llvm.vector.extract.v2i16.v16i16(<16 x i16> zeroinitializer, i64 6)
+ %4 = call <2 x i16> @llvm.vector.extract.v2i16.v16i16(<16 x i16> zeroinitializer, i64 8)
+ %5 = call <2 x i16> @llvm.vector.extract.v2i16.v16i16(<16 x i16> zeroinitializer, i64 10)
+ %6 = call <2 x i16> @llvm.vector.extract.v2i16.v16i16(<16 x i16> zeroinitializer, i64 12)
+ %7 = call <2 x i16> @llvm.vector.extract.v2i16.v16i16(<16 x i16> zeroinitializer, i64 14)
+ br i1 %cmp0, label %if, label %end
+
+if: ; preds = %if, %entry
+ %8 = phi i64 [ 0, %entry ], [ %16, %if ]
+ %9 = phi i64 [ 0, %entry ], [ %17, %if ]
+ %10 = phi i64 [ 0, %entry ], [ %18, %if ]
+ %11 = phi i64 [ 0, %entry ], [ %19, %if ]
+ %12 = insertelement <4 x i64> poison, i64 %8, i64 0
+ %13 = insertelement <4 x i64> %12, i64 %9, i64 1
+ %14 = insertelement <4 x i64> %13, i64 %10, i64 2
+ %15 = insertelement <4 x i64> %14, i64 %11, i64 3
+ %cast = bitcast <4 x i64> %15 to <16 x i16>
+ %cmp1 = icmp eq i32 %cond, 1
+ %16 = extractelement <4 x i64> %value, i64 0
+ %17 = extractelement <4 x i64> %value, i64 1
+ %18 = extractelement <4 x i64> %value, i64 2
+ %19 = extractelement <4 x i64> %value, i64 3
+ %20 = call <2 x i16> @llvm.vector.extract.v2i16.v16i16(<16 x i16> %cast, i64 0)
+ %21 = call <2 x i16> @llvm.vector.extract.v2i16.v16i16(<16 x i16> %cast, i64 2)
+ %22 = call <2 x i16> @llvm.vector.extract.v2i16.v16i16(<16 x i16> %cast, i64 4)
+ %23 = call <2 x i16> @llvm.vector.extract.v2i16.v16i16(<16 x i16> %cast, i64 6)
+ %24 = call <2 x i16> @llvm.vector.extract.v2i16.v16i16(<16 x i16> %cast, i64 8)
+ %25 = call <2 x i16> @llvm.vector.extract.v2i16.v16i16(<16 x i16> %cast, i64 10)
+ %26 = call <2 x i16> @llvm.vector.extract.v2i16.v16i16(<16 x i16> %cast, i64 12)
+ %27 = call <2 x i16> @llvm.vector.extract.v2i16.v16i16(<16 x i16> %cast, i64 14)
+ br i1 %cmp1, label %if, label %end
+
+end: ; preds = %if, %entry
+ %28 = phi <2 x i16> [ %0, %entry ], [ %20, %if ]
+ %29 = phi <2 x i16> [ %1, %entry ], [ %21, %if ]
+ %30 = phi <2 x i16> [ %2, %entry ], [ %22, %if ]
+ %31 = phi <2 x i16> [ %3, %entry ], [ %23, %if ]
+ %32 = phi <2 x i16> [ %4, %entry ], [ %24, %if ]
+ %33 = phi <2 x i16> [ %5, %entry ], [ %25, %if ]
+ %34 = phi <2 x i16> [ %6, %entry ], [ %26, %if ]
+ %35 = phi <2 x i16> [ %7, %entry ], [ %27, %if ]
+ %36 = call <16 x i16> @llvm.vector.insert.v16i16.v2i16(<16 x i16> poison, <2 x i16> %28, i64 0)
+ %37 = call <16 x i16> @llvm.vector.insert.v16i16.v2i16(<16 x i16> %36, <2 x i16> %29, i64 2)
+ %38 = call <16 x i16> @llvm.vector.insert.v16i16.v2i16(<16 x i16> %37, <2 x i16> %30, i64 4)
+ %39 = call <16 x i16> @llvm.vector.insert.v16i16.v2i16(<16 x i16> %38, <2 x i16> %31, i64 6)
+ %40 = call <16 x i16> @llvm.vector.insert.v16i16.v2i16(<16 x i16> %39, <2 x i16> %32, i64 8)
+ %41 = call <16 x i16> @llvm.vector.insert.v16i16.v2i16(<16 x i16> %40, <2 x i16> %33, i64 10)
+ %42 = call <16 x i16> @llvm.vector.insert.v16i16.v2i16(<16 x i16> %41, <2 x i16> %34, i64 12)
+ %43 = call <16 x i16> @llvm.vector.insert.v16i16.v2i16(<16 x i16> %42, <2 x i16> %35, i64 14)
+ store <16 x i16> %43, ptr addrspace(1) %out, align 32
+ ret void
+}
+
+declare <2 x i16> @llvm.vector.extract.v2i16.v16i16(<16 x i16>, i64 immarg)
+declare <16 x i16> @llvm.vector.insert.v16i16.v2i16(<16 x i16>, <2 x i16>, i64 immarg)
Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -21516,7 +21516,7 @@
}
// Only cast if the size is the same
- if (Src.getValueType().getSizeInBits() != VT.getSizeInBits())
+ if (!Src || Src.getValueType().getSizeInBits() != VT.getSizeInBits())
return SDValue();
return DAG.getBitcast(VT, Src);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D143886.496864.patch
Type: text/x-patch
Size: 4664 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230213/4396dc5a/attachment.bin>
More information about the llvm-commits
mailing list