brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.3 KiB · e3dcfe3 Raw
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