Reopen #128938. Attempt to shrink the size of vector loads where only some of the incoming lanes are used for rebroadcasts in shufflevector instructions. --------- Co-authored-by: Leon Clark <leoclark@amd.com> Co-authored-by: Simon Pilgrim <llvm-dev@redking.me.uk>
405 lines
20 KiB
LLVM
405 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
|
|
}
|