[llvm] [VectorCombine] Fold vector.reduce.OP(F(X)) == 0 -> OP(X) == 0 (PR #173069)
Valeriy Savchenko via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 7 09:06:00 PST 2026
================
@@ -0,0 +1,600 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -passes=instcombine -S < %s | FileCheck %s
+
+define i1 @or_zext(<4 x i16> %x) {
+; CHECK-LABEL: define i1 @or_zext(
+; CHECK-SAME: <4 x i16> [[X:%.*]]) {
+; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.vector.reduce.or.v4i16(<4 x i16> [[X]])
+; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[TMP1]], 0
+; CHECK-NEXT: ret i1 [[CMP]]
+;
+ %zext = zext <4 x i16> %x to <4 x i32>
+ %red = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %zext)
+ %cmp = icmp eq i32 %red, 0
+ ret i1 %cmp
+}
+
+define i1 @or_zext_i3(<4 x i3> %x) {
+; CHECK-LABEL: define i1 @or_zext_i3(
+; CHECK-SAME: <4 x i3> [[X:%.*]]) {
+; CHECK-NEXT: [[TMP1:%.*]] = call i3 @llvm.vector.reduce.or.v4i3(<4 x i3> [[X]])
+; CHECK-NEXT: [[CMP:%.*]] = icmp eq i3 [[TMP1]], 0
+; CHECK-NEXT: ret i1 [[CMP]]
+;
+ %zext = zext <4 x i3> %x to <4 x i32>
+ %red = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %zext)
----------------
SavchenkoValeriy wrote:
I added a cost check and a test when it doesn't fire because of the cost check. Please see if that's what you had in mind
https://github.com/llvm/llvm-project/pull/173069
More information about the llvm-commits
mailing list