brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · 4ce9e11 Raw
74 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; A multi-dimensional array in a nested loop.inner doing vector stores that5; aren't yet aligned. InferAlignment can understand the addressing in the6; Nice case to prove 16 byte alignment. In the Awkward case, the inner7; array dimension is not even, so the stores to it won't always be aligned.8;9; InferAlignment should prove alignment in exactly one of the two cases.10 11@Nice    = global [1001 x [20000 x double]] zeroinitializer, align 3212@Awkward = global [1001 x [20001 x double]] zeroinitializer, align 3213 14define void @nested_loop() {15; CHECK-LABEL: define void @nested_loop() {16; CHECK-NEXT:  entry:17; CHECK-NEXT:    br label [[LOOP_OUTER:%.*]]18; CHECK:       loop.outer:19; CHECK-NEXT:    [[I:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP_OUTER_TAIL:%.*]] ]20; CHECK-NEXT:    br label [[LOOP_INNER:%.*]]21; CHECK:       loop.inner:22; CHECK-NEXT:    [[J:%.*]] = phi i64 [ 0, [[LOOP_OUTER]] ], [ [[J_NEXT:%.*]], [[LOOP_INNER_TAIL:%.*]] ]23; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr [1001 x [20000 x double]], ptr @Nice, i64 0, i64 [[I]], i64 [[J]]24; CHECK-NEXT:    store <2 x double> zeroinitializer, ptr [[GEP_1]], align 1625; CHECK-NEXT:    [[LOAD_1:%.*]] = load <2 x double>, ptr [[GEP_1]], align 1626; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr [1001 x [20001 x double]], ptr @Awkward, i64 0, i64 [[I]], i64 [[J]]27; CHECK-NEXT:    store <2 x double> zeroinitializer, ptr [[GEP_2]], align 828; CHECK-NEXT:    [[LOAD_2:%.*]] = load <2 x double>, ptr [[GEP_2]], align 829; CHECK-NEXT:    br label [[LOOP_INNER_TAIL]]30; CHECK:       loop.inner.tail:31; CHECK-NEXT:    [[J_NEXT]] = add i64 [[J]], 232; CHECK-NEXT:    [[J_CMP:%.*]] = icmp eq i64 [[J_NEXT]], 55633; CHECK-NEXT:    br i1 [[J_CMP]], label [[LOOP_OUTER_TAIL]], label [[LOOP_INNER]]34; CHECK:       loop.outer.tail:35; CHECK-NEXT:    [[I_NEXT]] = add i64 [[I]], 136; CHECK-NEXT:    [[I_CMP:%.*]] = icmp eq i64 [[I_NEXT]], 99137; CHECK-NEXT:    br i1 [[I_CMP]], label [[RETURN:%.*]], label [[LOOP_OUTER]]38; CHECK:       return:39; CHECK-NEXT:    ret void40;41entry:42  br label %loop.outer43 44loop.outer:45  %i = phi i64 [ 0, %entry ], [ %i.next, %loop.outer.tail ]46  br label %loop.inner47 48loop.inner:49  %j = phi i64 [ 0, %loop.outer ], [ %j.next, %loop.inner.tail ]50 51  %gep.1 = getelementptr [1001 x [20000 x double]], ptr @Nice, i64 0, i64 %i, i64 %j52  store <2 x double><double 0.0, double 0.0>, ptr %gep.1, align 853  %load.1 = load <2 x double>, ptr %gep.1, align 854 55  %gep.2 = getelementptr [1001 x [20001 x double]], ptr @Awkward, i64 0, i64 %i, i64 %j56  store <2 x double><double 0.0, double 0.0>, ptr %gep.2, align 857  %load.2 = load <2 x double>, ptr %gep.2, align 858 59  br label %loop.inner.tail60 61loop.inner.tail:62  %j.next = add i64 %j, 263  %j.cmp = icmp eq i64 %j.next, 55664  br i1 %j.cmp, label %loop.outer.tail, label %loop.inner65 66loop.outer.tail:67  %i.next = add i64 %i, 168  %i.cmp = icmp eq i64 %i.next, 99169  br i1 %i.cmp, label %return, label %loop.outer70 71return:72  ret void73}74