[llvm] [VPlan] Compute blend masks from minimum set of edge masks (PR #201783)

Luke Lau via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 22 22:06:04 PDT 2026


================
@@ -1145,14 +1146,16 @@ define float @reduction_conditional(ptr %A, ptr %B, ptr %C, float %S) {
 ; CHECK-INTERLEAVED-NEXT:    [[TMP16:%.*]] = select <4 x i1> [[TMP6]], <4 x i1> [[TMP8]], <4 x i1> zeroinitializer
 ; CHECK-INTERLEAVED-NEXT:    [[TMP17:%.*]] = fadd fast <4 x float> [[VEC_PHI]], [[WIDE_LOAD]]
 ; CHECK-INTERLEAVED-NEXT:    [[TMP18:%.*]] = fadd fast <4 x float> [[VEC_PHI1]], [[WIDE_LOAD2]]
+; CHECK-INTERLEAVED-NEXT:    [[TMP27:%.*]] = xor <4 x i1> [[TMP5]], splat (i1 true)
+; CHECK-INTERLEAVED-NEXT:    [[TMP28:%.*]] = xor <4 x i1> [[TMP6]], splat (i1 true)
 ; CHECK-INTERLEAVED-NEXT:    [[TMP20:%.*]] = select <4 x i1> [[TMP19]], <4 x i1> [[TMP11]], <4 x i1> zeroinitializer
 ; CHECK-INTERLEAVED-NEXT:    [[TMP22:%.*]] = select <4 x i1> [[TMP21]], <4 x i1> [[TMP12]], <4 x i1> zeroinitializer
-; CHECK-INTERLEAVED-NEXT:    [[PREDPHI:%.*]] = select <4 x i1> [[TMP20]], <4 x float> [[VEC_PHI]], <4 x float> [[TMP13]]
-; CHECK-INTERLEAVED-NEXT:    [[PREDPHI5:%.*]] = select <4 x i1> [[TMP15]], <4 x float> [[TMP17]], <4 x float> [[PREDPHI]]
-; CHECK-INTERLEAVED-NEXT:    [[PREDPHI6]] = select <4 x i1> [[TMP5]], <4 x float> [[PREDPHI5]], <4 x float> [[VEC_PHI]]
-; CHECK-INTERLEAVED-NEXT:    [[PREDPHI7:%.*]] = select <4 x i1> [[TMP22]], <4 x float> [[VEC_PHI1]], <4 x float> [[TMP14]]
-; CHECK-INTERLEAVED-NEXT:    [[PREDPHI8:%.*]] = select <4 x i1> [[TMP16]], <4 x float> [[TMP18]], <4 x float> [[PREDPHI7]]
-; CHECK-INTERLEAVED-NEXT:    [[PREDPHI9]] = select <4 x i1> [[TMP6]], <4 x float> [[PREDPHI8]], <4 x float> [[VEC_PHI1]]
+; CHECK-INTERLEAVED-NEXT:    [[TMP25:%.*]] = or <4 x i1> [[TMP20]], [[TMP27]]
+; CHECK-INTERLEAVED-NEXT:    [[TMP26:%.*]] = or <4 x i1> [[TMP22]], [[TMP28]]
+; CHECK-INTERLEAVED-NEXT:    [[PREDPHI:%.*]] = select <4 x i1> [[TMP25]], <4 x float> [[VEC_PHI]], <4 x float> [[TMP13]]
----------------
lukel97 wrote:

Double checked the test-suite diffs there, they all seem to be improvements, mostly on TSVC, e.g.

```diff
--- build.armv9-a-O3-base/MultiSource/Benchmarks/TSVC/ControlFlow-dbl/CMakeFiles/ControlFlow-dbl.dir/tsc.s	2026-07-23 04:32:57.798801819 +0000
+++ build.armv9-a-O3-head/MultiSource/Benchmarks/TSVC/ControlFlow-dbl/CMakeFiles/ControlFlow-dbl.dir/tsc.s	2026-07-23 04:17:36.704060642 +0000
@@ -11344,37 +11344,35 @@
 	ldr	z0, [x12]
 	decd	x13
 	fcmgt	p0.d, p4/z, z0.d, #0.0
-	not	p2.b, p4/z, p0.b
-	ld1d	{ z1.d }, p2/z, [x11]
-	ld1d	{ z2.d }, p2/z, [x10]
+	not	p1.b, p4/z, p0.b
+	ld1d	{ z1.d }, p1/z, [x11]
+	ld1d	{ z2.d }, p1/z, [x10]
 	fnmls	z1.d, p4/m, z2.d, z2.d
-	fcmge	p3.d, p4/z, z0.d, z1.d
-	st1d	{ z1.d }, p2, [x11]
-	bic	p1.b, p2/z, p2.b, p3.b
-	not	p2.b, p4/z, p3.b
-	ld1d	{ z0.d }, p1/z, [x8]
-	ld1d	{ z3.d }, p1/z, [x9]
-	mov	p2.b, p0/m, p0.b
+	fcmge	p2.d, p4/z, z0.d, z1.d
+	st1d	{ z1.d }, p1, [x11]
+	bic	p3.b, p1/z, p1.b, p2.b
+	not	p1.b, p4/z, p2.b
+	ld1d	{ z0.d }, p3/z, [x8]
+	ld1d	{ z3.d }, p3/z, [x9]
+	mov	p1.b, p0/m, p0.b
 	fmad	z0.d, p4/m, z2.d, z3.d
-	not	p2.b, p4/z, p2.b
-	ld1d	{ z3.d }, p2/z, [x9]
-	st1d	{ z0.d }, p1, [x9]
+	not	p1.b, p4/z, p1.b
+	ld1d	{ z3.d }, p1/z, [x9]
+	st1d	{ z0.d }, p3, [x9]
 	ld1d	{ z4.d }, p0/z, [x9]
 	ld1d	{ z5.d }, p0/z, [x8]
-	mov	z0.d, p3/m, z3.d
+	mov	z0.d, p2/m, z3.d
 	incb	x8
 	fnmls	z4.d, p4/m, z5.d, z5.d
 	st1d	{ z4.d }, p0, [x9]
 	mov	z0.d, p0/m, z4.d
 	incb	x9
-	ld1d	{ z5.d }, p0/z, [x10]
-	ld1d	{ z6.d }, p0/z, [x11]
+	ld1d	{ z3.d }, p0/z, [x10]
+	ld1d	{ z5.d }, p0/z, [x11]
 	incb	x10
 	incb	x11
-	sel	z3.d, p0, z5.d, z2.d
-	sel	z5.d, p0, z6.d, z1.d
-	sel	z2.d, p1, z2.d, z3.d
-	sel	z1.d, p1, z1.d, z5.d
+	mov	z2.d, p0/m, z3.d
+	mov	z1.d, p0/m, z5.d
 	fmad	z0.d, p4/m, z2.d, z1.d
 	str	z0, [x12]
 	incb	x12
```

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


More information about the llvm-commits mailing list