Files
clang-p2996/llvm/test/Transforms/SLPVectorizer/X86/reduction-bool-logic-op-inside.ll
Alexey Bataev 4c997e1536 [SLP]Fix PR70507: emit freeeze whenever required for bool logical ops in
the middle of reduction ops.

Need to emit freeze instruction not only in the case, where the root is
bool logical op, but also if we reduce several scalars, but unable to
say precisely, if the root is bool logical op.
2023-10-31 12:23:12 -07:00

46 lines
1.9 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
; RUN: opt -S < %s --passes=slp-vectorizer | FileCheck %s
define i1 @test(i32 %x) {
; CHECK-LABEL: define i1 @test(
; CHECK-SAME: i32 [[X:%.*]]) {
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X]], 1
; CHECK-NEXT: [[OP_RDX:%.*]] = select i1 [[CMP]], i1 true, i1 poison
; CHECK-NEXT: ret i1 [[OP_RDX]]
;
%cmp = icmp sgt i32 %x, 1
%sel1 = select i1 %cmp, i1 true, i1 poison
%sel2 = select i1 %sel1, i1 true, i1 poison
%sel3 = select i1 %sel2, i1 true, i1 poison
%sel4 = select i1 %cmp, i1 true, i1 poison
%ret = or i1 %sel3, %sel4
ret i1 %ret
}
define i1 @test1(i32 %x, i32 %a, i32 %b, i32 %c, i32 %d) {
; CHECK-LABEL: define i1 @test1(
; CHECK-SAME: i32 [[X:%.*]], i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]], i32 [[D:%.*]]) {
; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x i32> poison, i32 [[X]], i32 0
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x i32> [[TMP1]], i32 [[D]], i32 1
; CHECK-NEXT: [[TMP3:%.*]] = insertelement <4 x i32> [[TMP2]], i32 [[A]], i32 2
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> [[TMP3]], i32 [[B]], i32 3
; CHECK-NEXT: [[TMP5:%.*]] = icmp sgt <4 x i32> [[TMP4]], <i32 1, i32 1, i32 1, i32 1>
; CHECK-NEXT: [[CMP3:%.*]] = icmp sgt i32 [[C]], 1
; CHECK-NEXT: [[TMP6:%.*]] = freeze <4 x i1> [[TMP5]]
; CHECK-NEXT: [[TMP7:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP6]])
; CHECK-NEXT: [[OP_RDX:%.*]] = select i1 [[TMP7]], i1 true, i1 [[CMP3]]
; CHECK-NEXT: ret i1 [[OP_RDX]]
;
%cmp = icmp sgt i32 %x, 1
%cmp1 = icmp sgt i32 %a, 1
%cmp2 = icmp sgt i32 %b, 1
%cmp3 = icmp sgt i32 %c, 1
%cmp4 = icmp sgt i32 %d, 1
%sel1 = select i1 %cmp, i1 true, i1 %cmp1
%sel2 = select i1 %sel1, i1 true, i1 %cmp2
%sel3 = select i1 %sel2, i1 true, i1 %cmp3
%sel4 = select i1 %cmp, i1 true, i1 %cmp4
%ret = or i1 %sel3, %sel4
ret i1 %ret
}