[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / GlobalISel / gep.ll
blob20047fd7b08137aad25c80cccaa05c74d637648f
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=x86_64-linux-gnu -global-isel -verify-machineinstrs < %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X64_GISEL
3 ; RUN: llc -mtriple=x86_64-linux-gnu              -verify-machineinstrs < %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X64
5 define i32* @test_gep_i8(i32 *%arr, i8 %ind) {
6 ; X64_GISEL-LABEL: test_gep_i8:
7 ; X64_GISEL:       # %bb.0:
8 ; X64_GISEL-NEXT:    # kill: def $esi killed $esi def $rsi
9 ; X64_GISEL-NEXT:    movq $56, %rcx
10 ; X64_GISEL-NEXT:    shlq %cl, %rsi
11 ; X64_GISEL-NEXT:    movq $56, %rcx
12 ; X64_GISEL-NEXT:    sarq %cl, %rsi
13 ; X64_GISEL-NEXT:    movq $4, %rax
14 ; X64_GISEL-NEXT:    imulq %rsi, %rax
15 ; X64_GISEL-NEXT:    addq %rdi, %rax
16 ; X64_GISEL-NEXT:    retq
18 ; X64-LABEL: test_gep_i8:
19 ; X64:       # %bb.0:
20 ; X64-NEXT:    # kill: def $esi killed $esi def $rsi
21 ; X64-NEXT:    movsbq %sil, %rax
22 ; X64-NEXT:    leaq (%rdi,%rax,4), %rax
23 ; X64-NEXT:    retq
24   %arrayidx = getelementptr i32, i32* %arr, i8 %ind
25   ret i32* %arrayidx
28 define i32* @test_gep_i8_const(i32 *%arr) {
29 ; X64_GISEL-LABEL: test_gep_i8_const:
30 ; X64_GISEL:       # %bb.0:
31 ; X64_GISEL-NEXT:    movq $80, %rax
32 ; X64_GISEL-NEXT:    addq %rdi, %rax
33 ; X64_GISEL-NEXT:    retq
35 ; X64-LABEL: test_gep_i8_const:
36 ; X64:       # %bb.0:
37 ; X64-NEXT:    leaq 80(%rdi), %rax
38 ; X64-NEXT:    retq
39   %arrayidx = getelementptr i32, i32* %arr, i8 20
40   ret i32* %arrayidx
43 define i32* @test_gep_i16(i32 *%arr, i16 %ind) {
44 ; X64_GISEL-LABEL: test_gep_i16:
45 ; X64_GISEL:       # %bb.0:
46 ; X64_GISEL-NEXT:    # kill: def $esi killed $esi def $rsi
47 ; X64_GISEL-NEXT:    movq $48, %rcx
48 ; X64_GISEL-NEXT:    shlq %cl, %rsi
49 ; X64_GISEL-NEXT:    movq $48, %rcx
50 ; X64_GISEL-NEXT:    sarq %cl, %rsi
51 ; X64_GISEL-NEXT:    movq $4, %rax
52 ; X64_GISEL-NEXT:    imulq %rsi, %rax
53 ; X64_GISEL-NEXT:    addq %rdi, %rax
54 ; X64_GISEL-NEXT:    retq
56 ; X64-LABEL: test_gep_i16:
57 ; X64:       # %bb.0:
58 ; X64-NEXT:    # kill: def $esi killed $esi def $rsi
59 ; X64-NEXT:    movswq %si, %rax
60 ; X64-NEXT:    leaq (%rdi,%rax,4), %rax
61 ; X64-NEXT:    retq
62   %arrayidx = getelementptr i32, i32* %arr, i16 %ind
63   ret i32* %arrayidx
66 define i32* @test_gep_i16_const(i32 *%arr) {
67 ; X64_GISEL-LABEL: test_gep_i16_const:
68 ; X64_GISEL:       # %bb.0:
69 ; X64_GISEL-NEXT:    movq $80, %rax
70 ; X64_GISEL-NEXT:    addq %rdi, %rax
71 ; X64_GISEL-NEXT:    retq
73 ; X64-LABEL: test_gep_i16_const:
74 ; X64:       # %bb.0:
75 ; X64-NEXT:    leaq 80(%rdi), %rax
76 ; X64-NEXT:    retq
77   %arrayidx = getelementptr i32, i32* %arr, i16 20
78   ret i32* %arrayidx
81 define i32* @test_gep_i32(i32 *%arr, i32 %ind) {
82 ; X64_GISEL-LABEL: test_gep_i32:
83 ; X64_GISEL:       # %bb.0:
84 ; X64_GISEL-NEXT:    movslq %esi, %rax
85 ; X64_GISEL-NEXT:    movq $4, %rcx
86 ; X64_GISEL-NEXT:    imulq %rax, %rcx
87 ; X64_GISEL-NEXT:    leaq (%rdi,%rcx), %rax
88 ; X64_GISEL-NEXT:    retq
90 ; X64-LABEL: test_gep_i32:
91 ; X64:       # %bb.0:
92 ; X64-NEXT:    movslq %esi, %rax
93 ; X64-NEXT:    leaq (%rdi,%rax,4), %rax
94 ; X64-NEXT:    retq
95   %arrayidx = getelementptr i32, i32* %arr, i32 %ind
96   ret i32* %arrayidx
99 define i32* @test_gep_i32_const(i32 *%arr) {
100 ; X64_GISEL-LABEL: test_gep_i32_const:
101 ; X64_GISEL:       # %bb.0:
102 ; X64_GISEL-NEXT:    movq $20, %rax
103 ; X64_GISEL-NEXT:    addq %rdi, %rax
104 ; X64_GISEL-NEXT:    retq
106 ; X64-LABEL: test_gep_i32_const:
107 ; X64:       # %bb.0:
108 ; X64-NEXT:    leaq 20(%rdi), %rax
109 ; X64-NEXT:    retq
110   %arrayidx = getelementptr i32, i32* %arr, i32 5
111   ret i32* %arrayidx
114 define i32* @test_gep_i64(i32 *%arr, i64 %ind) {
115 ; X64_GISEL-LABEL: test_gep_i64:
116 ; X64_GISEL:       # %bb.0:
117 ; X64_GISEL-NEXT:    movq $4, %rax
118 ; X64_GISEL-NEXT:    imulq %rsi, %rax
119 ; X64_GISEL-NEXT:    addq %rdi, %rax
120 ; X64_GISEL-NEXT:    retq
122 ; X64-LABEL: test_gep_i64:
123 ; X64:       # %bb.0:
124 ; X64-NEXT:    leaq (%rdi,%rsi,4), %rax
125 ; X64-NEXT:    retq
126   %arrayidx = getelementptr i32, i32* %arr, i64 %ind
127   ret i32* %arrayidx
130 define i32* @test_gep_i64_const(i32 *%arr) {
131 ; X64_GISEL-LABEL: test_gep_i64_const:
132 ; X64_GISEL:       # %bb.0:
133 ; X64_GISEL-NEXT:    movq $20, %rax
134 ; X64_GISEL-NEXT:    addq %rdi, %rax
135 ; X64_GISEL-NEXT:    retq
137 ; X64-LABEL: test_gep_i64_const:
138 ; X64:       # %bb.0:
139 ; X64-NEXT:    leaq 20(%rdi), %rax
140 ; X64-NEXT:    retq
141   %arrayidx = getelementptr i32, i32* %arr, i64 5
142   ret i32* %arrayidx