[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / InferAlignment / gep-array.ll
blob6f6051144b710f89eaad4f371a1974d7a0c9c27e
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2 ; RUN: opt -passes=infer-alignment -S < %s | FileCheck %s
4 ; ------------------------------------------------------------------------------
5 ; Array of pair
6 ; ------------------------------------------------------------------------------
8 ; Check that we improve the alignment information.
9 ; The base pointer is 16-byte aligned and we access the field at offsets of 8
10 ; bytes.
11 ; Every element in the @array.simple array is 16-byte aligned so any access from
12 ; the following gep is 8-byte aligned.
14 %pair.simple = type { ptr, i32 }
15 @array.simple = global [4 x %pair.simple] zeroinitializer, align 16
17 define void @simple_pair(i64 %idx) {
18 ; CHECK-LABEL: define void @simple_pair
19 ; CHECK-SAME: (i64 [[IDX:%.*]]) {
20 ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds [4 x %pair.simple], ptr @array.simple, i64 0, i64 [[IDX]], i32 1
21 ; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[GEP]], align 8
22 ; CHECK-NEXT:    store i32 0, ptr [[GEP]], align 8
23 ; CHECK-NEXT:    ret void
25   %gep = getelementptr inbounds [4 x %pair.simple], ptr @array.simple, i64 0, i64 %idx, i32 1
27   %res = load i32, ptr %gep, align 1
28   store i32 0, ptr %gep, align 1
30   ret void
33 ; ------------------------------------------------------------------------------
34 ; Array of pair of arrays
35 ; ------------------------------------------------------------------------------
37 %pair.array = type { [3 x i32], [3 x i32] }
38 @array.array = internal global [3 x %pair.array] zeroinitializer
40 define void @load_nested() {
41 ; CHECK-LABEL: define void @load_nested() {
42 ; CHECK-NEXT:    [[X_0:%.*]] = load i32, ptr @array.array, align 16
43 ; CHECK-NEXT:    [[X_1:%.*]] = load i32, ptr getelementptr inbounds ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 1), align 4
44 ; CHECK-NEXT:    [[X_2:%.*]] = load i32, ptr getelementptr inbounds ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 2), align 8
45 ; 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
46 ; 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
47 ; CHECK-NEXT:    ret void
49   %x.0 =  load i32, ptr @array.array, align 4
50   %x.1 =  load i32, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 1), align 4
51   %x.2 =  load i32, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 2), align 4
52   %x.3 =  load i32, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 3), align 4
53   %x.4 =  load i32, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 4), align 4
54   ret void
57 define void @store_nested() {
58 ; CHECK-LABEL: define void @store_nested() {
59 ; CHECK-NEXT:    store i32 1, ptr @array.array, align 16
60 ; CHECK-NEXT:    store i32 1, ptr getelementptr inbounds ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 1), align 4
61 ; CHECK-NEXT:    store i32 1, ptr getelementptr inbounds ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 2), align 8
62 ; CHECK-NEXT:    store i32 1, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 3), align 4
63 ; CHECK-NEXT:    store i32 1, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 4), align 16
64 ; CHECK-NEXT:    ret void
66   store i32 1, ptr @array.array, align 4
67   store i32 1, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 1), align 4
68   store i32 1, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 2), align 4
69   store i32 1, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 3), align 4
70   store i32 1, ptr getelementptr ([3 x %pair.array], ptr @array.array, i64 0, i64 0, i32 0, i64 4), align 4
71   ret void