| ; 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 | |
| } |