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