; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 ; RUN: opt < %s -passes=instcombine -S | FileCheck %s define i32 @reduce_add_eliminate_mask(ptr %p) { ; CHECK-LABEL: define i32 @reduce_add_eliminate_mask( ; CHECK-SAME: ptr [[P:%.*]]) { ; CHECK-NEXT: [[VEC:%.*]] = load <4 x i32>, ptr [[P]], align 16 ; CHECK-NEXT: [[AND:%.*]] = and <4 x i32> [[VEC]], splat (i32 268435455) ; CHECK-NEXT: [[SUM:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[AND]]) ; CHECK-NEXT: ret i32 [[SUM]] ; %vec = load <4 x i32>, ptr %p %and = and <4 x i32> %vec, splat (i32 268435455) %sum = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %and) %masked = and i32 %sum, 1073741823 ret i32 %masked } define i1 @reduce_add_simplify_comparison(ptr %p) { ; CHECK-LABEL: define i1 @reduce_add_simplify_comparison( ; CHECK-SAME: ptr [[P:%.*]]) { ; CHECK-NEXT: ret i1 true ; %vec = load <8 x i32>, ptr %p %and = and <8 x i32> %vec, splat (i32 16777215) %sum = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %and) %cmp = icmp ult i32 %sum, 134217728 ret i1 %cmp } define i64 @reduce_add_sext(ptr %p) { ; CHECK-LABEL: define i64 @reduce_add_sext( ; CHECK-SAME: ptr [[P:%.*]]) { ; CHECK-NEXT: [[VEC:%.*]] = load <2 x i32>, ptr [[P]], align 8 ; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[VEC]], splat (i32 4194303) ; CHECK-NEXT: [[SUM:%.*]] = call i32 @llvm.vector.reduce.add.v2i32(<2 x i32> [[AND]]) ; CHECK-NEXT: [[EXT:%.*]] = zext nneg i32 [[SUM]] to i64 ; CHECK-NEXT: ret i64 [[EXT]] ; %vec = load <2 x i32>, ptr %p %and = and <2 x i32> %vec, splat (i32 4194303) %sum = call i32 @llvm.vector.reduce.add.v2i32(<2 x i32> %and) %ext = sext i32 %sum to i64 ret i64 %ext }