diff --git a/llvm/test/Transforms/SLPVectorizer/X86/multi-use-bicasted-reduction.ll b/llvm/test/Transforms/SLPVectorizer/X86/multi-use-bitcasted-reduction.ll similarity index 77% rename from llvm/test/Transforms/SLPVectorizer/X86/multi-use-bicasted-reduction.ll rename to llvm/test/Transforms/SLPVectorizer/X86/multi-use-bitcasted-reduction.ll index c5c978c9d22b14..b1129535812972 100644 --- a/llvm/test/Transforms/SLPVectorizer/X86/multi-use-bicasted-reduction.ll +++ b/llvm/test/Transforms/SLPVectorizer/X86/multi-use-bitcasted-reduction.ll @@ -1,9 +1,9 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 -; RUN: opt -passes=slp-vectorizer -S -mattr=+sse4.2 < %s | FileCheck %s +; RUN: opt -passes=slp-vectorizer -S -mtriple=x86_64-unknown-linux -mattr=+sse4.2 -slp-threshold=-2 < %s | FileCheck %s define i32 @test(i32 %arg, i32 %arg1, i1 %arg4, i1 %arg5) { ; CHECK-LABEL: define i32 @test( -; CHECK-SAME: i32 [[ARG:%.*]], i32 [[ARG1:%.*]], i1 [[ARG4:%.*]], i1 [[ARG5:%.*]]) { +; CHECK-SAME: i32 [[ARG:%.*]], i32 [[ARG1:%.*]], i1 [[ARG4:%.*]], i1 [[ARG5:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[BB:.*:]] ; CHECK-NEXT: [[TMP0:%.*]] = insertelement <4 x i32> poison, i32 [[ARG]], i32 0 ; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x i32> [[TMP0]], i32 [[ARG1]], i32 1 @@ -74,38 +74,42 @@ bb20: define i32 @test_multi_cond_use(i32 %arg, i32 %arg1, i1 %arg4, i1 %arg5) { ; CHECK-LABEL: define i32 @test_multi_cond_use( -; CHECK-SAME: i32 [[ARG:%.*]], i32 [[ARG1:%.*]], i1 [[ARG4:%.*]], i1 [[ARG5:%.*]]) { +; CHECK-SAME: i32 [[ARG:%.*]], i32 [[ARG1:%.*]], i1 [[ARG4:%.*]], i1 [[ARG5:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[BB:.*:]] ; CHECK-NEXT: [[TMP0:%.*]] = insertelement <4 x i32> poison, i32 [[ARG]], i32 0 ; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x i32> [[TMP0]], i32 [[ARG1]], i32 1 -; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> poison, <4 x i32> +; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> poison, <4 x i32> ; CHECK-NEXT: [[TMP3:%.*]] = sdiv <4 x i32> [[TMP2]], splat (i32 64) -; CHECK-NEXT: [[TMP4:%.*]] = shl <4 x i32> [[TMP3]], -; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> poison, <4 x i32> -; CHECK-NEXT: [[TMP6:%.*]] = icmp ne <4 x i32> [[TMP4]], [[TMP5]] -; CHECK-NEXT: [[TMP14:%.*]] = icmp eq <4 x i32> [[TMP4]], [[TMP5]] -; CHECK-NEXT: [[TMP15:%.*]] = shufflevector <4 x i1> [[TMP6]], <4 x i1> [[TMP14]], <4 x i32> -; CHECK-NEXT: [[TMP7:%.*]] = select <4 x i1> [[TMP15]], <4 x i32> , <4 x i32> -; CHECK-NEXT: [[TMP8:%.*]] = extractelement <4 x i1> [[TMP15]], i32 3 +; CHECK-NEXT: [[TMP4:%.*]] = shl <4 x i32> [[TMP3]], +; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> poison, <4 x i32> +; CHECK-NEXT: [[TMP6:%.*]] = icmp eq <4 x i32> [[TMP4]], [[TMP5]] +; CHECK-NEXT: [[TMP7:%.*]] = icmp ne <4 x i32> [[TMP4]], [[TMP5]] +; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <4 x i1> [[TMP6]], <4 x i1> [[TMP7]], <4 x i32> +; CHECK-NEXT: [[TMP8:%.*]] = extractelement <4 x i1> [[TMP10]], i32 2 ; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[TMP8]] to i32 +; CHECK-NEXT: [[ICMP7:%.*]] = extractelement <4 x i1> [[TMP10]], i32 3 +; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[ICMP7]], i32 0, i32 2 +; CHECK-NEXT: [[ICMP9:%.*]] = extractelement <4 x i1> [[TMP10]], i32 1 +; CHECK-NEXT: [[TMP12:%.*]] = select i1 [[ICMP9]], i32 0, i32 4 +; CHECK-NEXT: [[ICMP11:%.*]] = extractelement <4 x i1> [[TMP10]], i32 0 +; CHECK-NEXT: [[TMP13:%.*]] = select i1 [[ICMP11]], i32 0, i32 8 +; CHECK-NEXT: [[EXT1:%.*]] = zext i1 [[ICMP11]] to i32 ; CHECK-NEXT: br i1 [[ARG4]], label %[[BB13:.*]], label %[[BB16:.*]] ; CHECK: [[COMMON_RET:.*]]: -; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ [[EXT]], %[[BB20:.*]] ], [ [[OR19:%.*]], %[[BB17:.*]] ] +; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ [[EXT1]], %[[BB20:.*]] ], [ [[OR19:%.*]], %[[BB17:.*]] ] ; CHECK-NEXT: ret i32 [[COMMON_RET_OP]] ; CHECK: [[BB13]]: -; CHECK-NEXT: [[TMP9:%.*]] = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> [[TMP7]]) +; CHECK-NEXT: [[OR:%.*]] = or i32 [[SELECT]], [[EXT]] +; CHECK-NEXT: [[OR14:%.*]] = or i32 [[OR]], [[TMP12]] +; CHECK-NEXT: [[TMP9:%.*]] = or i32 [[OR14]], [[TMP13]] ; CHECK-NEXT: ret i32 [[TMP9]] ; CHECK: [[BB16]]: ; CHECK-NEXT: br i1 [[ARG5]], label %[[BB17]], label %[[BB20]] ; CHECK: [[BB17]]: -; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i32> [[TMP7]], i32 0 -; CHECK-NEXT: [[TMP11:%.*]] = extractelement <4 x i32> [[TMP7]], i32 1 -; CHECK-NEXT: [[OR18:%.*]] = or i32 [[TMP11]], [[TMP10]] -; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i32> [[TMP7]], i32 2 +; CHECK-NEXT: [[OR18:%.*]] = or i32 [[SELECT]], [[EXT]] ; CHECK-NEXT: [[OR19]] = or i32 [[OR18]], [[TMP12]] ; CHECK-NEXT: br label %[[COMMON_RET]] ; CHECK: [[BB20]]: -; CHECK-NEXT: [[TMP13:%.*]] = extractelement <4 x i32> [[TMP7]], i32 3 ; CHECK-NEXT: store volatile i32 [[TMP13]], ptr null, align 4294967296 ; CHECK-NEXT: br label %[[COMMON_RET]] ;