[mlir] Update Ch-2.md (#121379)
[llvm-project.git] / llvm / test / Transforms / InstCombine / gep-vector.ll
blobd8a65b69aceff746cdda3d2a50d12a56581183c6
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes=instcombine %s -S | FileCheck %s
4 @block = global [64 x [8192 x i8]] zeroinitializer, align 1
6 define <2 x ptr> @vectorindex1() {
7 ; CHECK-LABEL: @vectorindex1(
8 ; CHECK-NEXT:    ret <2 x ptr> getelementptr inbounds ([64 x [8192 x i8]], ptr @block, <2 x i64> zeroinitializer, <2 x i64> <i64 0, i64 1>, <2 x i64> splat (i64 8192))
10   %1 = getelementptr inbounds [64 x [8192 x i8]], ptr @block, i64 0, <2 x i64> <i64 0, i64 1>, i64 8192
11   ret <2 x ptr> %1
14 define <2 x ptr> @vectorindex2() {
15 ; CHECK-LABEL: @vectorindex2(
16 ; CHECK-NEXT:    ret <2 x ptr> getelementptr inbounds ([64 x [8192 x i8]], ptr @block, <2 x i64> zeroinitializer, <2 x i64> splat (i64 1), <2 x i64> <i64 8191, i64 8193>)
18   %1 = getelementptr inbounds [64 x [8192 x i8]], ptr @block, i64 0, i64 1, <2 x i64> <i64 8191, i64 8193>
19   ret <2 x ptr> %1
22 define <2 x ptr> @vectorindex3() {
23 ; CHECK-LABEL: @vectorindex3(
24 ; CHECK-NEXT:    ret <2 x ptr> getelementptr inbounds ([64 x [8192 x i8]], ptr @block, <2 x i64> zeroinitializer, <2 x i64> <i64 0, i64 1>, <2 x i64> <i64 8191, i64 8193>)
26   %1 = getelementptr inbounds [64 x [8192 x i8]], ptr @block, i64 0, <2 x i64> <i64 0, i64 1>, <2 x i64> <i64 8191, i64 8193>
27   ret <2 x ptr> %1
30 ; Negative test - datalayout's alloc size for the 2 types must match.
32 define ptr @bitcast_vec_to_array_gep(ptr %x, i64 %y, i64 %z) {
33 ; CHECK-LABEL: @bitcast_vec_to_array_gep(
34 ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr [7 x i32], ptr [[X:%.*]], i64 [[Y:%.*]], i64 [[Z:%.*]]
35 ; CHECK-NEXT:    ret ptr [[GEP]]
37   %gep = getelementptr [7 x i32], ptr %x, i64 %y, i64 %z
38   ret ptr %gep
41 ; Negative test - datalayout's alloc size for the 2 types must match.
43 define ptr @bitcast_array_to_vec_gep(ptr %x, i64 %y, i64 %z) {
44 ; CHECK-LABEL: @bitcast_array_to_vec_gep(
45 ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds <3 x i32>, ptr [[X:%.*]], i64 [[Y:%.*]], i64 [[Z:%.*]]
46 ; CHECK-NEXT:    ret ptr [[GEP]]
48   %gep = getelementptr inbounds <3 x i32>, ptr %x, i64 %y, i64 %z
49   ret ptr %gep
52 ; Sizes and types match - safe to remove bitcast.
54 define ptr @bitcast_vec_to_array_gep_matching_alloc_size(ptr %x, i64 %y, i64 %z) {
55 ; CHECK-LABEL: @bitcast_vec_to_array_gep_matching_alloc_size(
56 ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr [4 x i32], ptr [[X:%.*]], i64 [[Y:%.*]], i64 [[Z:%.*]]
57 ; CHECK-NEXT:    ret ptr [[GEP]]
59   %gep = getelementptr [4 x i32], ptr %x, i64 %y, i64 %z
60   ret ptr %gep
63 ; Sizes and types match - safe to remove bitcast.
65 define ptr @bitcast_array_to_vec_gep_matching_alloc_size(ptr %x, i64 %y, i64 %z) {
66 ; CHECK-LABEL: @bitcast_array_to_vec_gep_matching_alloc_size(
67 ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds <4 x i32>, ptr [[X:%.*]], i64 [[Y:%.*]], i64 [[Z:%.*]]
68 ; CHECK-NEXT:    ret ptr [[GEP]]
70   %gep = getelementptr inbounds <4 x i32>, ptr %x, i64 %y, i64 %z
71   ret ptr %gep
74 ; Negative test - datalayout's alloc size for the 2 types must match.
76 define ptr addrspace(3) @bitcast_vec_to_array_addrspace(ptr %x, i64 %y, i64 %z) {
77 ; CHECK-LABEL: @bitcast_vec_to_array_addrspace(
78 ; CHECK-NEXT:    [[ASC:%.*]] = addrspacecast ptr [[X:%.*]] to ptr addrspace(3)
79 ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr [7 x i32], ptr addrspace(3) [[ASC]], i64 [[Y:%.*]], i64 [[Z:%.*]]
80 ; CHECK-NEXT:    ret ptr addrspace(3) [[GEP]]
82   %asc = addrspacecast ptr %x to ptr addrspace(3)
83   %gep = getelementptr [7 x i32], ptr addrspace(3) %asc, i64 %y, i64 %z
84   ret ptr addrspace(3) %gep
87 ; Negative test - datalayout's alloc size for the 2 types must match.
89 define ptr addrspace(3) @inbounds_bitcast_vec_to_array_addrspace(ptr %x, i64 %y, i64 %z) {
90 ; CHECK-LABEL: @inbounds_bitcast_vec_to_array_addrspace(
91 ; CHECK-NEXT:    [[ASC:%.*]] = addrspacecast ptr [[X:%.*]] to ptr addrspace(3)
92 ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds [7 x i32], ptr addrspace(3) [[ASC]], i64 [[Y:%.*]], i64 [[Z:%.*]]
93 ; CHECK-NEXT:    ret ptr addrspace(3) [[GEP]]
95   %asc = addrspacecast ptr %x to ptr addrspace(3)
96   %gep = getelementptr inbounds [7 x i32], ptr addrspace(3) %asc, i64 %y, i64 %z
97   ret ptr addrspace(3) %gep
100 ; Sizes and types match - safe to remove bitcast.
102 define ptr addrspace(3) @bitcast_vec_to_array_addrspace_matching_alloc_size(ptr %x, i64 %y, i64 %z) {
103 ; CHECK-LABEL: @bitcast_vec_to_array_addrspace_matching_alloc_size(
104 ; CHECK-NEXT:    [[ASC:%.*]] = addrspacecast ptr [[X:%.*]] to ptr addrspace(3)
105 ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr [4 x i32], ptr addrspace(3) [[ASC]], i64 [[Y:%.*]], i64 [[Z:%.*]]
106 ; CHECK-NEXT:    ret ptr addrspace(3) [[GEP]]
108   %asc = addrspacecast ptr %x to ptr addrspace(3)
109   %gep = getelementptr [4 x i32], ptr addrspace(3) %asc, i64 %y, i64 %z
110   ret ptr addrspace(3) %gep
113 ; Sizes and types match - safe to remove bitcast.
115 define ptr addrspace(3) @inbounds_bitcast_vec_to_array_addrspace_matching_alloc_size(ptr %x, i64 %y, i64 %z) {
116 ; CHECK-LABEL: @inbounds_bitcast_vec_to_array_addrspace_matching_alloc_size(
117 ; CHECK-NEXT:    [[ASC:%.*]] = addrspacecast ptr [[X:%.*]] to ptr addrspace(3)
118 ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds [4 x i32], ptr addrspace(3) [[ASC]], i64 [[Y:%.*]], i64 [[Z:%.*]]
119 ; CHECK-NEXT:    ret ptr addrspace(3) [[GEP]]
121   %asc = addrspacecast ptr %x to ptr addrspace(3)
122   %gep = getelementptr inbounds [4 x i32], ptr addrspace(3) %asc, i64 %y, i64 %z
123   ret ptr addrspace(3) %gep
126 ; Negative test - avoid doing bitcast on ptr, because '16' should be scaled by 'vscale'.
128 define ptr @test_accumulate_constant_offset_vscale_nonzero(<vscale x 16 x i1> %pg, ptr %base) {
129 ; CHECK-LABEL: @test_accumulate_constant_offset_vscale_nonzero(
130 ; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @llvm.vscale.i64()
131 ; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[TMP1]], 4
132 ; CHECK-NEXT:    [[GEP_OFFS:%.*]] = or disjoint i64 [[TMP2]], 4
133 ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i8, ptr [[BASE:%.*]], i64 [[GEP_OFFS]]
134 ; CHECK-NEXT:    ret ptr [[GEP]]
136   %gep = getelementptr <vscale x 16 x i8>, ptr %base, i64 1, i64 4
137   ret ptr %gep
140 define ptr @test_accumulate_constant_offset_vscale_zero(<vscale x 16 x i1> %pg, ptr %base) {
141 ; CHECK-LABEL: @test_accumulate_constant_offset_vscale_zero(
142 ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i8, ptr [[BASE:%.*]], i64 4
143 ; CHECK-NEXT:    ret ptr [[GEP]]
145   %gep = getelementptr <vscale x 16 x i8>, ptr %base, i64 0, i64 4
146   ret ptr %gep