1 ; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 | FileCheck %s --check-prefix=ELF64
3 ; This test verifies that load/store instructions are properly generated,
4 ; and that they pass MI verification.
6 @a = global i8 1, align 1
7 @b = global i16 2, align 2
8 @c = global i32 4, align 4
9 @d = global i64 8, align 8
10 @e = global float 1.25, align 4
11 @f = global double 3.5, align 8
13 %struct.s = type<{ i8, i32 }>
14 %struct.t = type<{ i8, i64 }>
16 @g = global %struct.s <{ i8 1, i32 2 }>, align 1
17 @h = global %struct.t <{ i8 1, i64 2 }>, align 1
19 @i = common global [8192 x i64] zeroinitializer, align 8
23 define i8 @t1() nounwind uwtable ssp {
25 %1 = load i8* @a, align 1
32 define i16 @t2() nounwind uwtable ssp {
34 %1 = load i16* @b, align 2
36 %2 = add nsw i16 %1, 1
41 define i32 @t3() nounwind uwtable ssp {
43 %1 = load i32* @c, align 4
45 %2 = add nsw i32 %1, 1
50 define i64 @t4() nounwind uwtable ssp {
52 %1 = load i64* @d, align 4
54 %2 = add nsw i64 %1, 1
59 define float @t5() nounwind uwtable ssp {
61 %1 = load float* @e, align 4
63 %2 = fadd float %1, 1.0
68 define double @t6() nounwind uwtable ssp {
70 %1 = load double* @f, align 8
72 %2 = fadd double %1, 1.0
79 define void @t7(i8 %v) nounwind uwtable ssp {
82 store i8 %1, i8* @a, align 1
90 define void @t8(i16 %v) nounwind uwtable ssp {
92 %1 = add nsw i16 %v, 1
93 store i16 %1, i16* @b, align 2
101 define void @t9(i32 %v) nounwind uwtable ssp {
103 %1 = add nsw i32 %v, 1
104 store i32 %1, i32* @c, align 4
112 define void @t10(i64 %v) nounwind uwtable ssp {
114 %1 = add nsw i64 %v, 1
115 store i64 %1, i64* @d, align 4
123 define void @t11(float %v) nounwind uwtable ssp {
125 %1 = fadd float %v, 1.0
126 store float %1, float* @e, align 4
132 define void @t12(double %v) nounwind uwtable ssp {
134 %1 = fadd double %v, 1.0
135 store double %1, double* @f, align 8
141 ;; lwa requires an offset divisible by 4, so we need lwax here.
142 define i64 @t13() nounwind uwtable ssp {
144 %1 = load i32* getelementptr inbounds (%struct.s* @g, i32 0, i32 1), align 1
145 %2 = sext i32 %1 to i64
148 %3 = add nsw i64 %2, 1
153 ;; ld requires an offset divisible by 4, so we need ldx here.
154 define i64 @t14() nounwind uwtable ssp {
156 %1 = load i64* getelementptr inbounds (%struct.t* @h, i32 0, i32 1), align 1
159 %2 = add nsw i64 %1, 1
164 ;; std requires an offset divisible by 4, so we need stdx here.
165 define void @t15(i64 %v) nounwind uwtable ssp {
167 %1 = add nsw i64 %v, 1
168 store i64 %1, i64* getelementptr inbounds (%struct.t* @h, i32 0, i32 1), align 1
177 ;; ld requires an offset that fits in 16 bits, so we need ldx here.
178 define i64 @t16() nounwind uwtable ssp {
180 %1 = load i64* getelementptr inbounds ([8192 x i64]* @i, i32 0, i64 5000), align 8
184 %2 = add nsw i64 %1, 1
189 ;; std requires an offset that fits in 16 bits, so we need stdx here.
190 define void @t17(i64 %v) nounwind uwtable ssp {
192 %1 = add nsw i64 %v, 1
193 store i64 %1, i64* getelementptr inbounds ([8192 x i64]* @i, i32 0, i64 5000), align 8