|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 |
| 2 | +; RUN: opt -passes=no-op-function -S < %s | FileCheck %s |
| 3 | + |
| 4 | +; ------------------------------------------------------------------------------ |
| 5 | +; Array of pair |
| 6 | +; ------------------------------------------------------------------------------ |
| 7 | + |
| 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. |
| 13 | + |
| 14 | +%pair.simple = type { ptr, i32 } |
| 15 | +@array.simple = global [4 x %pair.simple] zeroinitializer, align 16 |
| 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 1 |
| 22 | +; CHECK-NEXT: store i32 0, ptr [[GEP]], align 1 |
| 23 | +; CHECK-NEXT: ret void |
| 24 | +; |
| 25 | + %gep = getelementptr inbounds [4 x %pair.simple], ptr @array.simple, i64 0, i64 %idx, i32 1 |
| 26 | + |
| 27 | + %res = load i32, ptr %gep, align 1 |
| 28 | + store i32 0, ptr %gep, align 1 |
| 29 | + |
| 30 | + ret void |
| 31 | +} |
| 32 | + |
| 33 | +; ------------------------------------------------------------------------------ |
| 34 | +; Array of pair of arrays |
| 35 | +; ------------------------------------------------------------------------------ |
| 36 | + |
| 37 | +%pair.array = type { [3 x i32], [3 x i32] } |
| 38 | +@array.array = internal global [3 x %pair.array] zeroinitializer |
| 39 | + |
| 40 | +define void @load_nested() { |
| 41 | +; CHECK-LABEL: define void @load_nested() { |
| 42 | +; CHECK-NEXT: [[X_0:%.*]] = load i32, ptr @array.array, align 4 |
| 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 4 |
| 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 4 |
| 47 | +; CHECK-NEXT: ret void |
| 48 | +; |
| 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 |
| 55 | +} |
| 56 | + |
| 57 | +define void @store_nested() { |
| 58 | +; CHECK-LABEL: define void @store_nested() { |
| 59 | +; CHECK-NEXT: store i32 1, ptr @array.array, align 4 |
| 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 4 |
| 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 4 |
| 64 | +; CHECK-NEXT: ret void |
| 65 | +; |
| 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 |
| 72 | +} |
0 commit comments