151 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 62; RUN: opt < %s -disable-output -passes="print<da>" -da-dump-monotonicity-report \3; RUN: -da-enable-monotonicity-check 2>&1 | FileCheck %s4 5; for (int i = 0; i < n; i++)6; a[x] = 0;7define void @single_loop_invariant(ptr %a, i64 %x, i64 %n) {8; CHECK-LABEL: 'single_loop_invariant'9; CHECK-NEXT: Monotonicity check:10; CHECK-NEXT: Inst: store i8 0, ptr %idx, align 111; CHECK-NEXT: Expr: %x12; CHECK-NEXT: Monotonicity: Invariant13; CHECK-EMPTY:14; CHECK-NEXT: Src: store i8 0, ptr %idx, align 1 --> Dst: store i8 0, ptr %idx, align 115; CHECK-NEXT: da analyze - consistent output [S]!16;17entry:18 %guard = icmp sgt i64 %n, 019 br i1 %guard, label %loop, label %exit20 21loop:22 %i = phi i64 [ 0, %entry ], [ %i.inc, %loop ]23 %idx = getelementptr inbounds i8, ptr %a, i64 %x24 store i8 0, ptr %idx25 %i.inc = add nsw i64 %i, 126 %exitcond = icmp eq i64 %i.inc, %n27 br i1 %exitcond, label %exit, label %loop28 29exit:30 ret void31}32 33; for (int i = 0; i < n; i++)34; a[(i % 2 == 0 ? x : y)] = 0;35define void @single_loop_variant(ptr %a, i64 %x, i64 %y, i64 %n) {36; CHECK-LABEL: 'single_loop_variant'37; CHECK-NEXT: Monotonicity check:38; CHECK-NEXT: Inst: store i8 0, ptr %idx, align 139; CHECK-NEXT: Expr: %offset40; CHECK-NEXT: Monotonicity: Unknown41; CHECK-NEXT: Reason: %offset42; CHECK-EMPTY:43; CHECK-NEXT: Src: store i8 0, ptr %idx, align 1 --> Dst: store i8 0, ptr %idx, align 144; CHECK-NEXT: da analyze - confused!45;46entry:47 %guard = icmp sgt i64 %n, 048 br i1 %guard, label %loop, label %exit49 50loop:51 %i = phi i64 [ 0, %entry ], [ %i.inc, %loop ]52 %offset = phi i64 [ %x, %entry ], [ %offset.next, %loop ]53 %offset.next = phi i64 [ %y, %entry ], [ %offset, %loop ]54 %idx = getelementptr inbounds i8, ptr %a, i64 %offset55 store i8 0, ptr %idx56 %i.inc = add nsw i64 %i, 157 %exitcond = icmp eq i64 %i.inc, %n58 br i1 %exitcond, label %exit, label %loop59 60exit:61 ret void62}63 64; for (int i = 0; i < n; i++)65; for (int j = 0; j < m; j++)66; a[x + i] = 0;67define void @invariant_plus_monotonic0(ptr %a, i64 %x, i64 %n, i64 %m) {68; CHECK-LABEL: 'invariant_plus_monotonic0'69; CHECK-NEXT: Monotonicity check:70; CHECK-NEXT: Inst: store i8 0, ptr %idx, align 171; CHECK-NEXT: Expr: {%x,+,1}<nsw><%loop.i.header>72; CHECK-NEXT: Monotonicity: MultivariateSignedMonotonic73; CHECK-EMPTY:74; CHECK-NEXT: Src: store i8 0, ptr %idx, align 1 --> Dst: store i8 0, ptr %idx, align 175; CHECK-NEXT: da analyze - consistent output [0 S]!76;77entry:78 %guard.i = icmp sgt i64 %n, 079 br i1 %guard.i, label %loop.i.header, label %exit80 81loop.i.header:82 %i = phi i64 [ 0, %entry ], [ %i.inc, %loop.i.latch ]83 %offset = phi i64 [ %x, %entry ], [ %offset.inc, %loop.i.latch ]84 br label %loop.j.preheader85 86loop.j.preheader:87 %gurard.j = icmp sgt i64 %m, 088 br i1 %gurard.j, label %loop.j, label %loop.i.latch89 90loop.j:91 %j = phi i64 [ 0, %loop.j.preheader ], [ %j.inc, %loop.j ]92 %idx = getelementptr inbounds i8, ptr %a, i64 %offset93 store i8 0, ptr %idx94 %j.inc = add nuw nsw i64 %j, 195 %exitcond.j = icmp eq i64 %j.inc, %m96 br i1 %exitcond.j, label %loop.i.latch, label %loop.j97 98loop.i.latch:99 %i.inc = add nsw i64 %i, 1100 %offset.inc = add nsw i64 %offset, 1101 %exitcond.i = icmp eq i64 %i.inc, %n102 br i1 %exitcond.i, label %exit, label %loop.i.header103 104exit:105 ret void106}107 108; for (int i = 0; i < n; i++)109; for (int j = 0; j < m; j++)110; a[x + j] = 0;111define void @invariant_plus_monotonic1(ptr %a, i64 %x, i64 %n, i64 %m) {112; CHECK-LABEL: 'invariant_plus_monotonic1'113; CHECK-NEXT: Monotonicity check:114; CHECK-NEXT: Inst: store i8 0, ptr %idx, align 1115; CHECK-NEXT: Expr: {%x,+,1}<nsw><%loop.j>116; CHECK-NEXT: Monotonicity: MultivariateSignedMonotonic117; CHECK-EMPTY:118; CHECK-NEXT: Src: store i8 0, ptr %idx, align 1 --> Dst: store i8 0, ptr %idx, align 1119; CHECK-NEXT: da analyze - consistent output [S 0]!120;121entry:122 %guard.i = icmp sgt i64 %n, 0123 br i1 %guard.i, label %loop.i.header, label %exit124 125loop.i.header:126 %i = phi i64 [ 0, %entry ], [ %i.inc, %loop.i.latch ]127 br label %loop.j.preheader128 129loop.j.preheader:130 %gurard.j = icmp sgt i64 %m, 0131 br i1 %gurard.j, label %loop.j, label %loop.i.latch132 133loop.j:134 %j = phi i64 [ 0, %loop.j.preheader ], [ %j.inc, %loop.j ]135 %offset = phi i64 [ %x, %loop.j.preheader ], [ %offset.inc, %loop.j ]136 %idx = getelementptr inbounds i8, ptr %a, i64 %offset137 store i8 0, ptr %idx138 %j.inc = add nuw nsw i64 %j, 1139 %offset.inc = add nsw i64 %offset, 1140 %exitcond.j = icmp eq i64 %j.inc, %m141 br i1 %exitcond.j, label %loop.i.latch, label %loop.j142 143loop.i.latch:144 %i.inc = add nsw i64 %i, 1145 %exitcond.i = icmp eq i64 %i.inc, %n146 br i1 %exitcond.i, label %exit, label %loop.i.header147 148exit:149 ret void150}151