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