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 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 17define 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 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 40define 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 ([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 ([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 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 57define 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 ([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 ([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 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} 73