xref: /llvm-project/llvm/test/CodeGen/Mips/GlobalISel/llvm-ir/load_store_fold.ll (revision 8663926a544602932d299dda435ed1ef70a05f48)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc  -O0 -mtriple=mipsel-linux-gnu -global-isel  -verify-machineinstrs %s -o -| FileCheck %s -check-prefixes=MIPS32
3
4define zeroext i8 @_16_bit_positive_offset(ptr %a) {
5; MIPS32-LABEL: _16_bit_positive_offset:
6; MIPS32:       # %bb.0: # %entry
7; MIPS32-NEXT:    lbu $2, 32767($4)
8; MIPS32-NEXT:    jr $ra
9; MIPS32-NEXT:    nop
10entry:
11  %arrayidx = getelementptr inbounds i8, ptr %a, i32 32767
12  %0 = load i8, ptr %arrayidx
13  ret i8 %0
14}
15
16define void @_16_bit_negative_offset(i8 %val, ptr %a) {
17; MIPS32-LABEL: _16_bit_negative_offset:
18; MIPS32:       # %bb.0: # %entry
19; MIPS32-NEXT:    sb $4, -32768($5)
20; MIPS32-NEXT:    jr $ra
21; MIPS32-NEXT:    nop
22entry:
23  %arrayidx = getelementptr inbounds i8, ptr %a, i32 -32768
24  store i8 %val, ptr %arrayidx
25  ret void
26}
27
28define void @_large_positive_offset(i8 %val, ptr %a) {
29; MIPS32-LABEL: _large_positive_offset:
30; MIPS32:       # %bb.0: # %entry
31; MIPS32-NEXT:    ori $1, $zero, 32768
32; MIPS32-NEXT:    addu $1, $5, $1
33; MIPS32-NEXT:    sb $4, 0($1)
34; MIPS32-NEXT:    jr $ra
35; MIPS32-NEXT:    nop
36entry:
37  %arrayidx = getelementptr inbounds i8, ptr %a, i32 32768
38  store i8 %val, ptr %arrayidx
39  ret void
40}
41
42define signext i8 @_large_negative_offset(ptr %a) {
43; MIPS32-LABEL: _large_negative_offset:
44; MIPS32:       # %bb.0: # %entry
45; MIPS32-NEXT:    lui $1, 65535
46; MIPS32-NEXT:    ori $1, $1, 32767
47; MIPS32-NEXT:    addu $1, $4, $1
48; MIPS32-NEXT:    lb $2, 0($1)
49; MIPS32-NEXT:    jr $ra
50; MIPS32-NEXT:    nop
51entry:
52  %arrayidx = getelementptr inbounds i8, ptr %a, i32 -32769
53  %0 = load i8, ptr %arrayidx
54  ret i8 %0
55}
56
57define float @fold_f32_load(ptr %a) {
58; MIPS32-LABEL: fold_f32_load:
59; MIPS32:       # %bb.0: # %entry
60; MIPS32-NEXT:    lwc1 $f0, 40($4)
61; MIPS32-NEXT:    jr $ra
62; MIPS32-NEXT:    nop
63entry:
64  %arrayidx = getelementptr inbounds float, ptr %a, i32 10
65  %0 = load float, ptr %arrayidx
66  ret float %0
67}
68
69define void @fold_f64_store(double %val, ptr %a) {
70; MIPS32-LABEL: fold_f64_store:
71; MIPS32:       # %bb.0: # %entry
72; MIPS32-NEXT:    sdc1 $f12, -80($6)
73; MIPS32-NEXT:    jr $ra
74; MIPS32-NEXT:    nop
75entry:
76  %arrayidx = getelementptr inbounds double, ptr %a, i32 -10
77  store double %val, ptr %arrayidx
78  ret void
79}
80
81define i16 @fold_i16_load(ptr %a) {
82; MIPS32-LABEL: fold_i16_load:
83; MIPS32:       # %bb.0: # %entry
84; MIPS32-NEXT:    lhu $2, -20($4)
85; MIPS32-NEXT:    jr $ra
86; MIPS32-NEXT:    nop
87entry:
88  %arrayidx = getelementptr inbounds i16, ptr %a, i32 -10
89  %0 = load i16, ptr %arrayidx
90  ret i16 %0
91}
92
93define void @fold_i32_store(i32 %val, ptr %a) {
94; MIPS32-LABEL: fold_i32_store:
95; MIPS32:       # %bb.0: # %entry
96; MIPS32-NEXT:    sw $4, 40($5)
97; MIPS32-NEXT:    jr $ra
98; MIPS32-NEXT:    nop
99entry:
100  %arrayidx = getelementptr inbounds i32, ptr %a, i32 10
101  store i32 %val, ptr %arrayidx
102  ret void
103}
104
105
106