[llvm] [DAG] visitFREEZE - always allow freezing multiple operands (PR #145939)

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 1 10:21:43 PDT 2025


================
@@ -23205,6 +23196,10 @@ SDValue DAGCombiner::visitINSERT_VECTOR_ELT(SDNode *N) {
       if (CurVec.isUndef())
         return CanonicalizeBuildVector(Ops);
 
+      // FREEZE(UNDEF) - build new BUILD_VECTOR from already inserted operands.
+      if (ISD::isFreezeUndef(CurVec.getNode()))
+        return CanonicalizeBuildVector(Ops, /*FreezeUndef=*/true);
----------------
RKSimon wrote:

```
define <4 x i4> @src(i4 %a0) {
#0:
  %f = freeze <4 x i4> undef
  %v0 = insertelement <4 x i4> %f, i4 %a0, i32 0
  ret <4 x i4> %v0
}
=>
define <4 x i4> @tgt(i4 %a0) {
#0:
  %f0 = freeze i4 undef
  %v0 = insertelement <4 x i4> poison, i4 %a0, i32 0
  %v1 = insertelement <4 x i4> %v0, i4 %f0, i32 1
  %v2 = insertelement <4 x i4> %v1, i4 %f0, i32 2
  %v3 = insertelement <4 x i4> %v2, i4 %f0, i32 3
  ret <4 x i4> %v3
}
Transformation seems to be correct!
```

https://github.com/llvm/llvm-project/pull/145939


More information about the llvm-commits mailing list