[llvm-branch-commits] [llvm] [ConstantFolding] Add constant folding for mask.beforefirst (PR #234472)

Luke Lau via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu Oct 22 03:54:43 PDT 2026


================
@@ -0,0 +1,58 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -p instsimplify -S < %s | FileCheck %s
+
+define <4 x i1> @v4i1_zero() {
+; CHECK-LABEL: define <4 x i1> @v4i1_zero() {
+; CHECK-NEXT:    ret <4 x i1> splat (i1 true)
+;
+  %res = call <4 x i1> @llvm.mask.beforefirst(<4 x i1> zeroinitializer)
+  ret <4 x i1> %res
+}
+
+define <4 x i1> @v4i1_ones() {
+; CHECK-LABEL: define <4 x i1> @v4i1_ones() {
+; CHECK-NEXT:    ret <4 x i1> zeroinitializer
+;
+  %res = call <4 x i1> @llvm.mask.beforefirst(<4 x i1> splat (i1 true))
+  ret <4 x i1> %res
+}
+
+define <4 x i1> @v4i1() {
+; CHECK-LABEL: define <4 x i1> @v4i1() {
+; CHECK-NEXT:    ret <4 x i1> <i1 true, i1 false, i1 false, i1 false>
+;
+  %res = call <4 x i1> @llvm.mask.beforefirst(<4 x i1> <i1 false, i1 true, i1 false, i1 true>)
+  ret <4 x i1> %res
+}
+
+define <4 x i1> @v4i1_poison() {
+; CHECK-LABEL: define <4 x i1> @v4i1_poison() {
+; CHECK-NEXT:    ret <4 x i1> poison
+;
+  %res = call <4 x i1> @llvm.mask.beforefirst(<4 x i1> <i1 false, i1 true, i1 poison, i1 false>)
----------------
lukel97 wrote:

I don't think it can be well defined because the expansion goes through cttz.elts which gives poison if any lane is poison (which in turn expands via a umax reduction intrinsic which has the same semantics), see #230551


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


More information about the llvm-branch-commits mailing list