|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 |
1 | 2 | ; RUN: opt < %s -passes=instcombine -S | FileCheck %s
|
2 | 3 |
|
3 | 4 | %vec = type { %vec_base }
|
4 | 5 | %vec_base = type { [4 x float] }
|
5 | 6 | %foo = type { %vec, %vec}
|
6 | 7 |
|
7 |
| -define void @test(i1 %tobool, ptr addrspace(1) %add.ptr.i) { |
| 8 | +define void @test(i1 %tobool, ptr addrspace(1) %add.ptr) { |
| 9 | +; CHECK-LABEL: define void @test( |
| 10 | +; CHECK-SAME: i1 [[TOBOOL:%.*]], ptr addrspace(1) [[ADD_PTR:%.*]]) { |
| 11 | +; CHECK-NEXT: [[ENTRY:.*:]] |
| 12 | +; CHECK-NEXT: [[LANE_0:%.*]] = alloca [[FOO:%.*]], align 16 |
| 13 | +; CHECK-NEXT: [[LANE_15:%.*]] = insertelement <16 x ptr> poison, ptr [[LANE_0]], i64 0 |
| 14 | +; CHECK-NEXT: br i1 [[TOBOOL]], label %[[F1:.*]], label %[[F0:.*]] |
| 15 | +; CHECK: [[F0]]: |
| 16 | +; CHECK-NEXT: [[MM_VECTORGEP:%.*]] = getelementptr inbounds [[FOO]], <16 x ptr> [[LANE_15]], <16 x i64> zeroinitializer, <16 x i32> splat (i32 1), <16 x i32> zeroinitializer, <16 x i32> zeroinitializer, <16 x i64> splat (i64 1) |
| 17 | +; CHECK-NEXT: br label %[[MERGE:.*]] |
| 18 | +; CHECK: [[F1]]: |
| 19 | +; CHECK-NEXT: [[MM_VECTORGEP2:%.*]] = getelementptr inbounds [[FOO]], <16 x ptr> [[LANE_15]], <16 x i64> zeroinitializer, <16 x i32> zeroinitializer, <16 x i32> zeroinitializer, <16 x i32> zeroinitializer, <16 x i64> splat (i64 1) |
| 20 | +; CHECK-NEXT: br label %[[MERGE]] |
| 21 | +; CHECK: [[MERGE]]: |
| 22 | +; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <16 x ptr> [ [[MM_VECTORGEP]], %[[F0]] ], [ [[MM_VECTORGEP2]], %[[F1]] ] |
| 23 | +; CHECK-NEXT: store <16 x ptr> [[VEC_PHI]], ptr addrspace(1) [[ADD_PTR]], align 128 |
| 24 | +; CHECK-NEXT: ret void |
| 25 | +; |
8 | 26 | entry:
|
9 | 27 | %lane.0 = alloca %foo, align 16
|
10 |
| - %lane.15 = insertelement <16 x ptr> undef, ptr %lane.0, i64 0 |
| 28 | + %lane.15 = insertelement <16 x ptr> poison, ptr %lane.0, i64 0 |
11 | 29 | %mm_vectorGEP = getelementptr inbounds %foo, <16 x ptr> %lane.15, <16 x i64> zeroinitializer, <16 x i32> splat (i32 1), <16 x i32> zeroinitializer, <16 x i32> zeroinitializer, <16 x i64> splat (i64 1)
|
12 | 30 | %mm_vectorGEP2 = getelementptr inbounds %foo, <16 x ptr> %lane.15, <16 x i64> zeroinitializer, <16 x i32> zeroinitializer, <16 x i32> zeroinitializer, <16 x i32> zeroinitializer, <16 x i64> splat (i64 1)
|
13 | 31 | br i1 %tobool, label %f1, label %f0
|
14 | 32 |
|
15 | 33 | f0:
|
16 |
| -; CHECK: f0: |
17 |
| -; CHECK-NEXT: %mm_vectorGEP = getelementptr inbounds %foo, <16 x ptr> %lane.15, <16 x i64> zeroinitializer, <16 x i32> splat (i32 1), <16 x i32> zeroinitializer, <16 x i32> zeroinitializer, <16 x i64> splat (i64 1) |
18 | 34 | br label %merge
|
19 | 35 |
|
20 | 36 | f1:
|
21 |
| -; CHECK: f1: |
22 |
| -; CHECK-NEXT: %mm_vectorGEP2 = getelementptr inbounds %foo, <16 x ptr> %lane.15, <16 x i64> zeroinitializer, <16 x i32> zeroinitializer, <16 x i32> zeroinitializer, <16 x i32> zeroinitializer, <16 x i64> splat (i64 1) |
23 | 37 | br label %merge
|
24 | 38 |
|
25 | 39 | merge:
|
26 |
| -; CHECK: merge: |
27 |
| -; CHECK-NEXT: %vec.phi14 = phi <16 x ptr> [ %mm_vectorGEP, %f0 ], [ %mm_vectorGEP2, %f1 ] |
28 |
| - %vec.phi14 = phi <16 x ptr> [ %mm_vectorGEP, %f0], [ %mm_vectorGEP2, %f1 ] |
29 |
| - %wide.masked.gather15 = call <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr> %vec.phi14, i32 4, <16 x i1> splat (i1 true), <16 x float> poison) |
30 |
| - %wide.masked.gather15.extract.15. = extractelement <16 x float> %wide.masked.gather15, i32 15 |
31 |
| - store float %wide.masked.gather15.extract.15., ptr addrspace(1) %add.ptr.i, align 4 |
| 40 | + %vec.phi = phi <16 x ptr> [ %mm_vectorGEP, %f0], [ %mm_vectorGEP2, %f1 ] |
| 41 | + store <16 x ptr> %vec.phi, ptr addrspace(1) %add.ptr |
32 | 42 | ret void
|
33 | 43 | }
|
34 |
| - |
35 |
| -declare <16 x float> @llvm.masked.gather.v16f32.v16p0(<16 x ptr>, i32 immarg, <16 x i1>, <16 x float>) |
|
0 commit comments