Update GetIndexRangeInShuffles to skip unused shuffles. This matches the behavior in the loop below and without it, we end up with an index mis-match, causing a crash for the added test case. PR: https://github.com/llvm/llvm-project/pull/179217
421 lines
20 KiB
LLVM
421 lines
20 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
|
|
; RUN: opt -passes=vector-combine -S < %s | FileCheck %s
|
|
|
|
define <8 x half> @shuffle_v4_v8f16_r0_1_volatile(ptr addrspace(1) nocapture readonly %arg0) local_unnamed_addr {
|
|
; CHECK-LABEL: define <8 x half> @shuffle_v4_v8f16_r0_1_volatile(
|
|
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]]) local_unnamed_addr {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x half>, ptr addrspace(1) [[ARG0]], align 32
|
|
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x half> [[TMP0]], <4 x half> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1>
|
|
; CHECK-NEXT: ret <8 x half> [[TMP1]]
|
|
;
|
|
entry:
|
|
%val0 = load volatile <4 x half>, ptr addrspace(1) %arg0, align 32
|
|
%val1 = shufflevector <4 x half> %val0, <4 x half> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1>
|
|
ret <8 x half> %val1
|
|
}
|
|
|
|
define <8 x half> @shuffle_v4_v8f16_r0_1(ptr addrspace(1) nocapture readonly %arg0) local_unnamed_addr {
|
|
; CHECK-LABEL: define <8 x half> @shuffle_v4_v8f16_r0_1(
|
|
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]]) local_unnamed_addr {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x half>, ptr addrspace(1) [[ARG0]], align 32
|
|
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <2 x half> [[TMP0]], <2 x half> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1>
|
|
; CHECK-NEXT: ret <8 x half> [[TMP1]]
|
|
;
|
|
entry:
|
|
%val0 = load <4 x half>, ptr addrspace(1) %arg0, align 32
|
|
%val1 = shufflevector <4 x half> %val0, <4 x half> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1>
|
|
ret <8 x half> %val1
|
|
}
|
|
|
|
define <8 x half> @shuffle_v4_v8f16_r0_2(ptr addrspace(1) nocapture readonly %arg0) local_unnamed_addr {
|
|
; CHECK-LABEL: define <8 x half> @shuffle_v4_v8f16_r0_2(
|
|
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]]) local_unnamed_addr {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <3 x half>, ptr addrspace(1) [[ARG0]], align 32
|
|
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <3 x half> [[TMP0]], <3 x half> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 2, i32 2, i32 2, i32 2>
|
|
; CHECK-NEXT: ret <8 x half> [[TMP1]]
|
|
;
|
|
entry:
|
|
%val0 = load <4 x half>, ptr addrspace(1) %arg0, align 32
|
|
%val1 = shufflevector <4 x half> %val0, <4 x half> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 2, i32 2, i32 2, i32 2>
|
|
ret <8 x half> %val1
|
|
}
|
|
|
|
define <4 x half> @shuffle_v4_v4f16_r1_2(ptr addrspace(1) nocapture readonly %arg0) local_unnamed_addr {
|
|
; CHECK-LABEL: define <4 x half> @shuffle_v4_v4f16_r1_2(
|
|
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]]) local_unnamed_addr {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <3 x half>, ptr addrspace(1) [[ARG0]], align 32
|
|
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <3 x half> [[TMP0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 2, i32 2>
|
|
; CHECK-NEXT: ret <4 x half> [[TMP1]]
|
|
;
|
|
entry:
|
|
%val0 = load <4 x half>, ptr addrspace(1) %arg0, align 32
|
|
%val1 = shufflevector <4 x half> %val0, <4 x half> poison, <4 x i32> <i32 1, i32 1, i32 2, i32 2>
|
|
ret <4 x half> %val1
|
|
}
|
|
|
|
define <8 x half> @shuffle_v4_v8f16_r1_2(ptr addrspace(1) nocapture readonly %arg0) local_unnamed_addr {
|
|
; CHECK-LABEL: define <8 x half> @shuffle_v4_v8f16_r1_2(
|
|
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]]) local_unnamed_addr {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <3 x half>, ptr addrspace(1) [[ARG0]], align 32
|
|
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <3 x half> [[TMP0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 2, i32 2, i32 2, i32 2>
|
|
; CHECK-NEXT: ret <8 x half> [[TMP1]]
|
|
;
|
|
entry:
|
|
%val0 = load <4 x half>, ptr addrspace(1) %arg0, align 32
|
|
%val1 = shufflevector <4 x half> %val0, <4 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 2, i32 2, i32 2, i32 2>
|
|
ret <8 x half> %val1
|
|
}
|
|
|
|
define <8 x half> @shuffle_v4_v8f16_cond_r0_1(ptr addrspace(1) nocapture readonly %arg0, i1 %cond) local_unnamed_addr {
|
|
; CHECK-LABEL: define <8 x half> @shuffle_v4_v8f16_cond_r0_1(
|
|
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]], i1 [[COND:%.*]]) local_unnamed_addr {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x half>, ptr addrspace(1) [[ARG0]], align 32
|
|
; CHECK-NEXT: br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
|
|
; CHECK: [[THEN]]:
|
|
; CHECK-NEXT: [[VAL1:%.*]] = shufflevector <2 x half> [[TMP0]], <2 x half> poison, <8 x i32> zeroinitializer
|
|
; CHECK-NEXT: br label %[[FINALLY:.*]]
|
|
; CHECK: [[ELSE]]:
|
|
; CHECK-NEXT: [[VAL2:%.*]] = shufflevector <2 x half> [[TMP0]], <2 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
|
|
; CHECK-NEXT: br label %[[FINALLY]]
|
|
; CHECK: [[FINALLY]]:
|
|
; CHECK-NEXT: [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
|
|
; CHECK-NEXT: ret <8 x half> [[VAL3]]
|
|
;
|
|
entry:
|
|
%val0 = load <4 x half>, ptr addrspace(1) %arg0, align 32
|
|
br i1 %cond, label %then, label %else
|
|
|
|
then:
|
|
%val1 = shufflevector <4 x half> %val0, <4 x half> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
|
|
br label %finally
|
|
|
|
else:
|
|
%val2 = shufflevector <4 x half> %val0, <4 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
|
|
br label %finally
|
|
|
|
finally:
|
|
%val3 = phi <8 x half> [ %val1, %then ], [ %val2, %else ]
|
|
ret <8 x half> %val3
|
|
}
|
|
|
|
define <4 x half> @shuffle_v4_v4f16_cond_r1_2(ptr addrspace(1) nocapture readonly %arg0, i1 %cond) local_unnamed_addr {
|
|
; CHECK-LABEL: define <4 x half> @shuffle_v4_v4f16_cond_r1_2(
|
|
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]], i1 [[COND:%.*]]) local_unnamed_addr {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <3 x half>, ptr addrspace(1) [[ARG0]], align 32
|
|
; CHECK-NEXT: br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
|
|
; CHECK: [[THEN]]:
|
|
; CHECK-NEXT: [[VAL1:%.*]] = shufflevector <3 x half> [[TMP0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
|
|
; CHECK-NEXT: br label %[[FINALLY:.*]]
|
|
; CHECK: [[ELSE]]:
|
|
; CHECK-NEXT: [[VAL2:%.*]] = shufflevector <3 x half> [[TMP0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
|
|
; CHECK-NEXT: br label %[[FINALLY]]
|
|
; CHECK: [[FINALLY]]:
|
|
; CHECK-NEXT: [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
|
|
; CHECK-NEXT: ret <4 x half> [[VAL3]]
|
|
;
|
|
entry:
|
|
%val0 = load <4 x half>, ptr addrspace(1) %arg0, align 32
|
|
br i1 %cond, label %then, label %else
|
|
|
|
then:
|
|
%val1 = shufflevector <4 x half> %val0, <4 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
|
|
br label %finally
|
|
|
|
else:
|
|
%val2 = shufflevector <4 x half> %val0, <4 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
|
|
br label %finally
|
|
|
|
finally:
|
|
%val3 = phi <4 x half> [ %val1, %then ], [ %val2, %else ]
|
|
ret <4 x half> %val3
|
|
}
|
|
|
|
define <8 x half> @shuffle_v4_v8f16_cond_r1_2(ptr addrspace(1) nocapture readonly %arg0, i1 %cond) local_unnamed_addr {
|
|
; CHECK-LABEL: define <8 x half> @shuffle_v4_v8f16_cond_r1_2(
|
|
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]], i1 [[COND:%.*]]) local_unnamed_addr {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <3 x half>, ptr addrspace(1) [[ARG0]], align 32
|
|
; CHECK-NEXT: br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
|
|
; CHECK: [[THEN]]:
|
|
; CHECK-NEXT: [[VAL1:%.*]] = shufflevector <3 x half> [[TMP0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
|
|
; CHECK-NEXT: br label %[[FINALLY:.*]]
|
|
; CHECK: [[ELSE]]:
|
|
; CHECK-NEXT: [[VAL2:%.*]] = shufflevector <3 x half> [[TMP0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
|
|
; CHECK-NEXT: br label %[[FINALLY]]
|
|
; CHECK: [[FINALLY]]:
|
|
; CHECK-NEXT: [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
|
|
; CHECK-NEXT: ret <8 x half> [[VAL3]]
|
|
;
|
|
entry:
|
|
%val0 = load <4 x half>, ptr addrspace(1) %arg0, align 32
|
|
br i1 %cond, label %then, label %else
|
|
|
|
then:
|
|
%val1 = shufflevector <4 x half> %val0, <4 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
|
|
br label %finally
|
|
|
|
else:
|
|
%val2 = shufflevector <4 x half> %val0, <4 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
|
|
br label %finally
|
|
|
|
finally:
|
|
%val3 = phi <8 x half> [ %val1, %then ], [ %val2, %else ]
|
|
ret <8 x half> %val3
|
|
}
|
|
|
|
define <8 x i32> @shuffle_v4_v8i32_r0_1(ptr addrspace(1) nocapture readonly %arg0) local_unnamed_addr {
|
|
; CHECK-LABEL: define <8 x i32> @shuffle_v4_v8i32_r0_1(
|
|
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]]) local_unnamed_addr {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i32>, ptr addrspace(1) [[ARG0]], align 32
|
|
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <2 x i32> [[TMP0]], <2 x i32> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1>
|
|
; CHECK-NEXT: ret <8 x i32> [[TMP1]]
|
|
;
|
|
entry:
|
|
%val0 = load <4 x i32>, ptr addrspace(1) %arg0, align 32
|
|
%val1 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1>
|
|
ret <8 x i32> %val1
|
|
}
|
|
|
|
define <8 x i32> @shuffle_v4_v8i32_r0_2(ptr addrspace(1) nocapture readonly %arg0) local_unnamed_addr {
|
|
; CHECK-LABEL: define <8 x i32> @shuffle_v4_v8i32_r0_2(
|
|
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]]) local_unnamed_addr {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <3 x i32>, ptr addrspace(1) [[ARG0]], align 32
|
|
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <3 x i32> [[TMP0]], <3 x i32> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 2, i32 2, i32 2, i32 2>
|
|
; CHECK-NEXT: ret <8 x i32> [[TMP1]]
|
|
;
|
|
entry:
|
|
%val0 = load <4 x i32>, ptr addrspace(1) %arg0, align 32
|
|
%val1 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 2, i32 2, i32 2, i32 2>
|
|
ret <8 x i32> %val1
|
|
}
|
|
|
|
define <4 x i32> @shuffle_v4_v4i32_r1_2(ptr addrspace(1) nocapture readonly %arg0) local_unnamed_addr {
|
|
; CHECK-LABEL: define <4 x i32> @shuffle_v4_v4i32_r1_2(
|
|
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]]) local_unnamed_addr {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <3 x i32>, ptr addrspace(1) [[ARG0]], align 32
|
|
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <3 x i32> [[TMP0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 2, i32 2>
|
|
; CHECK-NEXT: ret <4 x i32> [[TMP1]]
|
|
;
|
|
entry:
|
|
%val0 = load <4 x i32>, ptr addrspace(1) %arg0, align 32
|
|
%val1 = shufflevector <4 x i32> %val0, <4 x i32> poison, <4 x i32> <i32 1, i32 1, i32 2, i32 2>
|
|
ret <4 x i32> %val1
|
|
}
|
|
|
|
define <8 x i32> @shuffle_v4_v8i32_r1_2(ptr addrspace(1) nocapture readonly %arg0) local_unnamed_addr {
|
|
; CHECK-LABEL: define <8 x i32> @shuffle_v4_v8i32_r1_2(
|
|
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]]) local_unnamed_addr {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <3 x i32>, ptr addrspace(1) [[ARG0]], align 32
|
|
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <3 x i32> [[TMP0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 2, i32 2, i32 2, i32 2>
|
|
; CHECK-NEXT: ret <8 x i32> [[TMP1]]
|
|
;
|
|
entry:
|
|
%val0 = load <4 x i32>, ptr addrspace(1) %arg0, align 32
|
|
%val1 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 2, i32 2, i32 2, i32 2>
|
|
ret <8 x i32> %val1
|
|
}
|
|
|
|
define <8 x i32> @shuffle_v4_v8i32_cond_r0_1(ptr addrspace(1) nocapture readonly %arg0, i1 %cond) local_unnamed_addr {
|
|
; CHECK-LABEL: define <8 x i32> @shuffle_v4_v8i32_cond_r0_1(
|
|
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]], i1 [[COND:%.*]]) local_unnamed_addr {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i32>, ptr addrspace(1) [[ARG0]], align 32
|
|
; CHECK-NEXT: br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
|
|
; CHECK: [[THEN]]:
|
|
; CHECK-NEXT: [[VAL1:%.*]] = shufflevector <2 x i32> [[TMP0]], <2 x i32> poison, <8 x i32> zeroinitializer
|
|
; CHECK-NEXT: br label %[[FINALLY:.*]]
|
|
; CHECK: [[ELSE]]:
|
|
; CHECK-NEXT: [[VAL2:%.*]] = shufflevector <2 x i32> [[TMP0]], <2 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
|
|
; CHECK-NEXT: br label %[[FINALLY]]
|
|
; CHECK: [[FINALLY]]:
|
|
; CHECK-NEXT: [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
|
|
; CHECK-NEXT: ret <8 x i32> [[VAL3]]
|
|
;
|
|
entry:
|
|
%val0 = load <4 x i32>, ptr addrspace(1) %arg0, align 32
|
|
br i1 %cond, label %then, label %else
|
|
|
|
then:
|
|
%val1 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
|
|
br label %finally
|
|
|
|
else:
|
|
%val2 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
|
|
br label %finally
|
|
|
|
finally:
|
|
%val3 = phi <8 x i32> [ %val1, %then ], [ %val2, %else ]
|
|
ret <8 x i32> %val3
|
|
}
|
|
|
|
define <8 x i32> @shuffle_v4_v8i32_cond_r0_2(ptr addrspace(1) nocapture readonly %arg0, i1 %cond) local_unnamed_addr {
|
|
; CHECK-LABEL: define <8 x i32> @shuffle_v4_v8i32_cond_r0_2(
|
|
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]], i1 [[COND:%.*]]) local_unnamed_addr {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <3 x i32>, ptr addrspace(1) [[ARG0]], align 32
|
|
; CHECK-NEXT: br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
|
|
; CHECK: [[THEN]]:
|
|
; CHECK-NEXT: [[VAL1:%.*]] = shufflevector <3 x i32> [[TMP0]], <3 x i32> poison, <8 x i32> zeroinitializer
|
|
; CHECK-NEXT: br label %[[FINALLY:.*]]
|
|
; CHECK: [[ELSE]]:
|
|
; CHECK-NEXT: [[VAL2:%.*]] = shufflevector <3 x i32> [[TMP0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
|
|
; CHECK-NEXT: br label %[[FINALLY]]
|
|
; CHECK: [[FINALLY]]:
|
|
; CHECK-NEXT: [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
|
|
; CHECK-NEXT: ret <8 x i32> [[VAL3]]
|
|
;
|
|
entry:
|
|
%val0 = load <4 x i32>, ptr addrspace(1) %arg0, align 32
|
|
br i1 %cond, label %then, label %else
|
|
|
|
then:
|
|
%val1 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
|
|
br label %finally
|
|
|
|
else:
|
|
%val2 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
|
|
br label %finally
|
|
|
|
finally:
|
|
%val3 = phi <8 x i32> [ %val1, %then ], [ %val2, %else ]
|
|
ret <8 x i32> %val3
|
|
}
|
|
|
|
define <4 x i32> @shuffle_v4_v4i32_cond_r1_2(ptr addrspace(1) nocapture readonly %arg0, i1 %cond) local_unnamed_addr {
|
|
; CHECK-LABEL: define <4 x i32> @shuffle_v4_v4i32_cond_r1_2(
|
|
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]], i1 [[COND:%.*]]) local_unnamed_addr {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <3 x i32>, ptr addrspace(1) [[ARG0]], align 32
|
|
; CHECK-NEXT: br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
|
|
; CHECK: [[THEN]]:
|
|
; CHECK-NEXT: [[VAL1:%.*]] = shufflevector <3 x i32> [[TMP0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
|
|
; CHECK-NEXT: br label %[[FINALLY:.*]]
|
|
; CHECK: [[ELSE]]:
|
|
; CHECK-NEXT: [[VAL2:%.*]] = shufflevector <3 x i32> [[TMP0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
|
|
; CHECK-NEXT: br label %[[FINALLY]]
|
|
; CHECK: [[FINALLY]]:
|
|
; CHECK-NEXT: [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
|
|
; CHECK-NEXT: ret <4 x i32> [[VAL3]]
|
|
;
|
|
entry:
|
|
%val0 = load <4 x i32>, ptr addrspace(1) %arg0, align 32
|
|
br i1 %cond, label %then, label %else
|
|
|
|
then:
|
|
%val1 = shufflevector <4 x i32> %val0, <4 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
|
|
br label %finally
|
|
|
|
else:
|
|
%val2 = shufflevector <4 x i32> %val0, <4 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
|
|
br label %finally
|
|
|
|
finally:
|
|
%val3 = phi <4 x i32> [ %val1, %then ], [ %val2, %else ]
|
|
ret <4 x i32> %val3
|
|
}
|
|
|
|
define <8 x i32> @shuffle_v4_v8i32_cond_r1_2(ptr addrspace(1) nocapture readonly %arg0, i1 %cond) local_unnamed_addr {
|
|
; CHECK-LABEL: define <8 x i32> @shuffle_v4_v8i32_cond_r1_2(
|
|
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]], i1 [[COND:%.*]]) local_unnamed_addr {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load <3 x i32>, ptr addrspace(1) [[ARG0]], align 32
|
|
; CHECK-NEXT: br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
|
|
; CHECK: [[THEN]]:
|
|
; CHECK-NEXT: [[VAL1:%.*]] = shufflevector <3 x i32> [[TMP0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
|
|
; CHECK-NEXT: br label %[[FINALLY:.*]]
|
|
; CHECK: [[ELSE]]:
|
|
; CHECK-NEXT: [[VAL2:%.*]] = shufflevector <3 x i32> [[TMP0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
|
|
; CHECK-NEXT: br label %[[FINALLY]]
|
|
; CHECK: [[FINALLY]]:
|
|
; CHECK-NEXT: [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
|
|
; CHECK-NEXT: ret <8 x i32> [[VAL3]]
|
|
;
|
|
entry:
|
|
%val0 = load <4 x i32>, ptr addrspace(1) %arg0, align 32
|
|
br i1 %cond, label %then, label %else
|
|
|
|
then:
|
|
%val1 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
|
|
br label %finally
|
|
|
|
else:
|
|
%val2 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
|
|
br label %finally
|
|
|
|
finally:
|
|
%val3 = phi <8 x i32> [ %val1, %then ], [ %val2, %else ]
|
|
ret <8 x i32> %val3
|
|
}
|
|
|
|
define <8 x i32> @shuffle_v4_v8i32_cond_r1_4(ptr addrspace(1) nocapture readonly %arg0, i1 %cond) local_unnamed_addr {
|
|
; CHECK-LABEL: define <8 x i32> @shuffle_v4_v8i32_cond_r1_4(
|
|
; CHECK-SAME: ptr addrspace(1) readonly captures(none) [[ARG0:%.*]], i1 [[COND:%.*]]) local_unnamed_addr {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[VAL0:%.*]] = load <4 x i32>, ptr addrspace(1) [[ARG0]], align 32
|
|
; CHECK-NEXT: br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
|
|
; CHECK: [[THEN]]:
|
|
; CHECK-NEXT: [[VAL1:%.*]] = shufflevector <4 x i32> [[VAL0]], <4 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 2, i32 2, i32 2, i32 2>
|
|
; CHECK-NEXT: br label %[[FINALLY:.*]]
|
|
; CHECK: [[ELSE]]:
|
|
; CHECK-NEXT: [[VAL2:%.*]] = shufflevector <4 x i32> [[VAL0]], <4 x i32> poison, <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 4, i32 4, i32 4, i32 4>
|
|
; CHECK-NEXT: br label %[[FINALLY]]
|
|
; CHECK: [[FINALLY]]:
|
|
; CHECK-NEXT: [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
|
|
; CHECK-NEXT: ret <8 x i32> [[VAL3]]
|
|
;
|
|
entry:
|
|
%val0 = load <4 x i32>, ptr addrspace(1) %arg0, align 32
|
|
br i1 %cond, label %then, label %else
|
|
|
|
then:
|
|
%val1 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 2, i32 2, i32 2, i32 2>
|
|
br label %finally
|
|
|
|
else:
|
|
%val2 = shufflevector <4 x i32> %val0, <4 x i32> poison, <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 4, i32 4, i32 4, i32 4>
|
|
br label %finally
|
|
|
|
finally:
|
|
%val3 = phi <8 x i32> [ %val1, %then ], [ %val2, %else ]
|
|
ret <8 x i32> %val3
|
|
}
|
|
|
|
define <16 x i8> @shuffle_v16_v16i8_r0_31(ptr %arg) {
|
|
; CHECK-LABEL: define <16 x i8> @shuffle_v16_v16i8_r0_31(
|
|
; CHECK-SAME: ptr [[ARG:%.*]]) {
|
|
; CHECK-NEXT: [[LOAD:%.*]] = load <16 x i8>, ptr [[ARG]], align 1
|
|
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <16 x i8> [[LOAD]], <16 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
|
|
; CHECK-NEXT: ret <16 x i8> [[SHUF]]
|
|
;
|
|
%load= load <16 x i8>, ptr %arg, align 1
|
|
%shuf = shufflevector <16 x i8> %load, <16 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
|
|
ret <16 x i8> %shuf
|
|
}
|
|
|
|
; Verify that dead shuffle uses (with indices outside the range of used
|
|
; shuffles) are properly skipped when shrinking loads.
|
|
define <2 x double> @shuffle_with_dead_use(ptr %p) {
|
|
; CHECK-LABEL: define <2 x double> @shuffle_with_dead_use(
|
|
; CHECK-SAME: ptr [[P:%.*]]) {
|
|
; CHECK-NEXT: [[LOAD:%.*]] = load <3 x double>, ptr [[P]], align 8
|
|
; CHECK-NEXT: [[SHUF1:%.*]] = shufflevector <3 x double> [[LOAD]], <3 x double> poison, <2 x i32> <i32 0, i32 2>
|
|
; CHECK-NEXT: [[SHUF2:%.*]] = shufflevector <3 x double> [[LOAD]], <3 x double> poison, <2 x i32> <i32 2, i32 2>
|
|
; CHECK-NEXT: ret <2 x double> [[SHUF2]]
|
|
;
|
|
%load = load <3 x double>, ptr %p, align 8
|
|
%shuf1 = shufflevector <3 x double> %load, <3 x double> poison, <2 x i32> <i32 0, i32 2>
|
|
%shuf2 = shufflevector <3 x double> %load, <3 x double> poison, <2 x i32> <i32 2, i32 2>
|
|
ret <2 x double> %shuf2
|
|
}
|