[InstCombine] Signed saturation patterns
[llvm-core.git] / test / Transforms / InstCombine / gep-vector.ll
blobc0db01eab5bf9352aba06a3ecbf878183b9927ba
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -instcombine %s -S | FileCheck %s
4 @block = global [64 x [8192 x i8]] zeroinitializer, align 1
6 define <2 x i8*> @vectorindex1() {
7 ; CHECK-LABEL: @vectorindex1(
8 ; CHECK-NEXT:    ret <2 x i8*> getelementptr inbounds ([64 x [8192 x i8]], [64 x [8192 x i8]]* @block, <2 x i64> zeroinitializer, <2 x i64> <i64 1, i64 2>, <2 x i64> zeroinitializer)
10   %1 = getelementptr inbounds [64 x [8192 x i8]], [64 x [8192 x i8]]* @block, i64 0, <2 x i64> <i64 0, i64 1>, i64 8192
11   ret <2 x i8*> %1
14 define <2 x i8*> @vectorindex2() {
15 ; CHECK-LABEL: @vectorindex2(
16 ; CHECK-NEXT:    ret <2 x i8*> getelementptr inbounds ([64 x [8192 x i8]], [64 x [8192 x i8]]* @block, <2 x i64> zeroinitializer, <2 x i64> <i64 1, i64 2>, <2 x i64> <i64 8191, i64 1>)
18   %1 = getelementptr inbounds [64 x [8192 x i8]], [64 x [8192 x i8]]* @block, i64 0, i64 1, <2 x i64> <i64 8191, i64 8193>
19   ret <2 x i8*> %1
22 define <2 x i8*> @vectorindex3() {
23 ; CHECK-LABEL: @vectorindex3(
24 ; CHECK-NEXT:    ret <2 x i8*> getelementptr inbounds ([64 x [8192 x i8]], [64 x [8192 x i8]]* @block, <2 x i64> zeroinitializer, <2 x i64> <i64 0, i64 2>, <2 x i64> <i64 8191, i64 1>)
26   %1 = getelementptr inbounds [64 x [8192 x i8]], [64 x [8192 x i8]]* @block, i64 0, <2 x i64> <i64 0, i64 1>, <2 x i64> <i64 8191, i64 8193>
27   ret <2 x i8*> %1
30 define i32* @bitcast_vec_to_array_gep(<7 x i32>* %x, i64 %y, i64 %z) {
31 ; CHECK-LABEL: @bitcast_vec_to_array_gep(
32 ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr <7 x i32>, <7 x i32>* [[X:%.*]], i64 [[Y:%.*]], i64 [[Z:%.*]]
33 ; CHECK-NEXT:    ret i32* [[GEP]]
35   %arr_ptr = bitcast <7 x i32>* %x to [7 x i32]*
36   %gep = getelementptr [7 x i32], [7 x i32]* %arr_ptr, i64 %y, i64 %z
37   ret i32* %gep
40 define i32* @bitcast_array_to_vec_gep([3 x i32]* %x, i64 %y, i64 %z) {
41 ; CHECK-LABEL: @bitcast_array_to_vec_gep(
42 ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds [3 x i32], [3 x i32]* [[X:%.*]], i64 [[Y:%.*]], i64 [[Z:%.*]]
43 ; CHECK-NEXT:    ret i32* [[GEP]]
45   %vec_ptr = bitcast [3 x i32]* %x to <3 x i32>*
46   %gep = getelementptr inbounds <3 x i32>, <3 x i32>* %vec_ptr, i64 %y, i64 %z
47   ret i32* %gep
50 define i32 addrspace(3)* @bitcast_vec_to_array_addrspace(<7 x i32>* %x, i64 %y, i64 %z) {
51 ; CHECK-LABEL: @bitcast_vec_to_array_addrspace(
52 ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr <7 x i32>, <7 x i32>* [[X:%.*]], i64 [[Y:%.*]], i64 [[Z:%.*]]
53 ; CHECK-NEXT:    [[TMP1:%.*]] = addrspacecast i32* [[GEP]] to i32 addrspace(3)*
54 ; CHECK-NEXT:    ret i32 addrspace(3)* [[TMP1]]
56   %arr_ptr = bitcast <7 x i32>* %x to [7 x i32]*
57   %asc = addrspacecast [7 x i32]* %arr_ptr to [7 x i32] addrspace(3)*
58   %gep = getelementptr [7 x i32], [7 x i32] addrspace(3)* %asc, i64 %y, i64 %z
59   ret i32 addrspace(3)* %gep
62 define i32 addrspace(3)* @inbounds_bitcast_vec_to_array_addrspace(<7 x i32>* %x, i64 %y, i64 %z) {
63 ; CHECK-LABEL: @inbounds_bitcast_vec_to_array_addrspace(
64 ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds <7 x i32>, <7 x i32>* [[X:%.*]], i64 [[Y:%.*]], i64 [[Z:%.*]]
65 ; CHECK-NEXT:    [[TMP1:%.*]] = addrspacecast i32* [[GEP]] to i32 addrspace(3)*
66 ; CHECK-NEXT:    ret i32 addrspace(3)* [[TMP1]]
68   %arr_ptr = bitcast <7 x i32>* %x to [7 x i32]*
69   %asc = addrspacecast [7 x i32]* %arr_ptr to [7 x i32] addrspace(3)*
70   %gep = getelementptr inbounds [7 x i32], [7 x i32] addrspace(3)* %asc, i64 %y, i64 %z
71   ret i32 addrspace(3)* %gep