xref: /llvm-project/llvm/test/Transforms/InferAlignment/gep-array.ll (revision d10b76552f919ddb84347ab03908a55804ea6b8a)
13978f37cSDhruv Chawla; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
20f152a55SDhruv Chawla; RUN: opt -passes=infer-alignment -S < %s | FileCheck %s
33978f37cSDhruv Chawla
43978f37cSDhruv Chawla; ------------------------------------------------------------------------------
53978f37cSDhruv Chawla; Array of pair
63978f37cSDhruv Chawla; ------------------------------------------------------------------------------
73978f37cSDhruv Chawla
83978f37cSDhruv Chawla; Check that we improve the alignment information.
93978f37cSDhruv Chawla; The base pointer is 16-byte aligned and we access the field at offsets of 8
103978f37cSDhruv Chawla; bytes.
113978f37cSDhruv Chawla; Every element in the @array.simple array is 16-byte aligned so any access from
123978f37cSDhruv Chawla; the following gep is 8-byte aligned.
133978f37cSDhruv Chawla
143978f37cSDhruv Chawla%pair.simple = type { ptr, i32 }
153978f37cSDhruv Chawla@array.simple = global [4 x %pair.simple] zeroinitializer, align 16
163978f37cSDhruv Chawla
173978f37cSDhruv Chawladefine void @simple_pair(i64 %idx) {
183978f37cSDhruv Chawla; CHECK-LABEL: define void @simple_pair
193978f37cSDhruv Chawla; CHECK-SAME: (i64 [[IDX:%.*]]) {
203978f37cSDhruv Chawla; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds [4 x %pair.simple], ptr @array.simple, i64 0, i64 [[IDX]], i32 1
210f152a55SDhruv Chawla; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[GEP]], align 8
220f152a55SDhruv Chawla; CHECK-NEXT:    store i32 0, ptr [[GEP]], align 8
233978f37cSDhruv Chawla; CHECK-NEXT:    ret void
243978f37cSDhruv Chawla;
253978f37cSDhruv Chawla  %gep = getelementptr inbounds [4 x %pair.simple], ptr @array.simple, i64 0, i64 %idx, i32 1
263978f37cSDhruv Chawla
273978f37cSDhruv Chawla  %res = load i32, ptr %gep, align 1
283978f37cSDhruv Chawla  store i32 0, ptr %gep, align 1
293978f37cSDhruv Chawla
303978f37cSDhruv Chawla  ret void
313978f37cSDhruv Chawla}
323978f37cSDhruv Chawla
333978f37cSDhruv Chawla; ------------------------------------------------------------------------------
343978f37cSDhruv Chawla; Array of pair of arrays
353978f37cSDhruv Chawla; ------------------------------------------------------------------------------
363978f37cSDhruv Chawla
373978f37cSDhruv Chawla%pair.array = type { [3 x i32], [3 x i32] }
383978f37cSDhruv Chawla@array.array = internal global [3 x %pair.array] zeroinitializer
393978f37cSDhruv Chawla
403978f37cSDhruv Chawladefine void @load_nested() {
413978f37cSDhruv Chawla; CHECK-LABEL: define void @load_nested() {
420f152a55SDhruv Chawla; CHECK-NEXT:    [[X_0:%.*]] = load i32, ptr @array.array, align 16
43*d10b7655SNikita Popov; CHECK-NEXT:    [[X_1:%.*]] = load i32, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 1), align 4
44*d10b7655SNikita Popov; CHECK-NEXT:    [[X_2:%.*]] = load i32, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 2), align 8
453978f37cSDhruv Chawla; CHECK-NEXT:    [[X_3:%.*]] = load i32, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 3), align 4
460f152a55SDhruv Chawla; CHECK-NEXT:    [[X_4:%.*]] = load i32, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 4), align 16
473978f37cSDhruv Chawla; CHECK-NEXT:    ret void
483978f37cSDhruv Chawla;
493978f37cSDhruv Chawla  %x.0 =  load i32, ptr @array.array, align 4
503978f37cSDhruv Chawla  %x.1 =  load i32, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 1), align 4
513978f37cSDhruv Chawla  %x.2 =  load i32, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 2), align 4
523978f37cSDhruv Chawla  %x.3 =  load i32, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 3), align 4
533978f37cSDhruv Chawla  %x.4 =  load i32, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 4), align 4
543978f37cSDhruv Chawla  ret void
553978f37cSDhruv Chawla}
563978f37cSDhruv Chawla
573978f37cSDhruv Chawladefine void @store_nested() {
583978f37cSDhruv Chawla; CHECK-LABEL: define void @store_nested() {
590f152a55SDhruv Chawla; CHECK-NEXT:    store i32 1, ptr @array.array, align 16
60*d10b7655SNikita Popov; CHECK-NEXT:    store i32 1, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 1), align 4
61*d10b7655SNikita Popov; CHECK-NEXT:    store i32 1, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 2), align 8
623978f37cSDhruv Chawla; CHECK-NEXT:    store i32 1, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 3), align 4
630f152a55SDhruv Chawla; CHECK-NEXT:    store i32 1, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 4), align 16
643978f37cSDhruv Chawla; CHECK-NEXT:    ret void
653978f37cSDhruv Chawla;
663978f37cSDhruv Chawla  store i32 1, ptr @array.array, align 4
673978f37cSDhruv Chawla  store i32 1, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 1), align 4
683978f37cSDhruv Chawla  store i32 1, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 2), align 4
693978f37cSDhruv Chawla  store i32 1, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 3), align 4
703978f37cSDhruv Chawla  store i32 1, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 4), align 4
713978f37cSDhruv Chawla  ret void
723978f37cSDhruv Chawla}
73