112 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt < %s -passes=infer-alignment -S | FileCheck %s3 4; InferAlignment should be able to prove vector alignment in the5; presence of a few mild address computation tricks.6 7; ------------------------------------------------------------------------------8; alloca9; ------------------------------------------------------------------------------10 11define void @alloca(<2 x i64> %y) {12; CHECK-LABEL: define void @alloca13; CHECK-SAME: (<2 x i64> [[Y:%.*]]) {14; CHECK-NEXT: [[ALLOCA:%.*]] = alloca <2 x i64>, align 1615; CHECK-NEXT: [[LOAD:%.*]] = load <2 x i64>, ptr [[ALLOCA]], align 1616; CHECK-NEXT: store <2 x i64> [[Y]], ptr [[ALLOCA]], align 1617; CHECK-NEXT: ret void18;19 %alloca = alloca <2 x i64>20 %load = load <2 x i64>, ptr %alloca, align 121 store <2 x i64> %y, ptr %alloca, align 122 ret void23}24 25; ------------------------------------------------------------------------------26; global27; ------------------------------------------------------------------------------28 29@x.vector = external global <2 x i64>, align 1630 31define void @global(<2 x i64> %y) {32; CHECK-LABEL: define void @global33; CHECK-SAME: (<2 x i64> [[Y:%.*]]) {34; CHECK-NEXT: [[LOAD:%.*]] = load <2 x i64>, ptr @x.vector, align 1635; CHECK-NEXT: store <2 x i64> [[Y]], ptr @x.vector, align 1636; CHECK-NEXT: ret void37;38 %load = load <2 x i64>, ptr @x.vector, align 139 store <2 x i64> %y, ptr @x.vector, align 140 ret void41}42 43; ------------------------------------------------------------------------------44; getelementptr45; ------------------------------------------------------------------------------46 47@vector = external global <2 x i64>, align 1648@vector.arr = external global [13 x <2 x i64>], align 1649 50; ------------------------------------------------------------------------------51; 1d access52; ------------------------------------------------------------------------------53 54define void @vector_singular(i32 %i, <2 x i64> %y) {55; CHECK-LABEL: define void @vector_singular56; CHECK-SAME: (i32 [[I:%.*]], <2 x i64> [[Y:%.*]]) {57; CHECK-NEXT: [[GEP:%.*]] = getelementptr <2 x i64>, ptr @vector, i32 [[I]]58; CHECK-NEXT: [[LOAD:%.*]] = load <2 x i64>, ptr [[GEP]], align 1659; CHECK-NEXT: store <2 x i64> [[Y]], ptr [[GEP]], align 1660; CHECK-NEXT: ret void61;62 %gep = getelementptr <2 x i64>, ptr @vector, i32 %i63 %load = load <2 x i64>, ptr %gep, align 164 store <2 x i64> %y, ptr %gep, align 165 ret void66}67 68; ------------------------------------------------------------------------------69; 2d access70; ------------------------------------------------------------------------------71 72define void @vector_array(i32 %i, i32 %j, <2 x i64> %y) {73; CHECK-LABEL: define void @vector_array74; CHECK-SAME: (i32 [[I:%.*]], i32 [[J:%.*]], <2 x i64> [[Y:%.*]]) {75; CHECK-NEXT: [[GEP:%.*]] = getelementptr [13 x <2 x i64>], ptr @vector.arr, i32 [[I]], i32 [[J]]76; CHECK-NEXT: [[LOAD:%.*]] = load <2 x i64>, ptr [[GEP]], align 1677; CHECK-NEXT: store <2 x i64> [[Y]], ptr [[GEP]], align 1678; CHECK-NEXT: ret void79;80 %gep = getelementptr [13 x <2 x i64>], ptr @vector.arr, i32 %i, i32 %j81 %load = load <2 x i64>, ptr %gep, align 182 store <2 x i64> %y, ptr %gep, align 183 ret void84}85 86; ------------------------------------------------------------------------------87; non-vector array type88; ------------------------------------------------------------------------------89 90; When we see a unaligned load or store from an insufficiently aligned global or91; alloca, increase the alignment, turning it into an aligned load or store.92@x.array = internal global [4 x i32] zeroinitializer93 94define void @nonvector_array() {95; CHECK-LABEL: define void @nonvector_array() {96; CHECK-NEXT: [[LOAD_0:%.*]] = load <16 x i8>, ptr @x.array, align 1697; CHECK-NEXT: store <16 x i8> zeroinitializer, ptr @x.array, align 1698; CHECK-NEXT: [[GEP:%.*]] = getelementptr [4 x i32], ptr @x.array, i16 0, i16 299; CHECK-NEXT: [[LOAD_1:%.*]] = load <16 x i8>, ptr [[GEP]], align 8100; CHECK-NEXT: store <16 x i8> zeroinitializer, ptr [[GEP]], align 8101; CHECK-NEXT: ret void102;103 %load.0 = load <16 x i8>, ptr @x.array, align 1104 store <16 x i8> zeroinitializer, ptr @x.array, align 1105 106 %gep = getelementptr [4 x i32], ptr @x.array, i16 0, i16 2107 %load.1 = load <16 x i8>, ptr %gep, align 1108 store <16 x i8> zeroinitializer, ptr %gep, align 1109 110 ret void111}112