1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5 2; RUN: opt < %s -disable-output "-passes=print<da>" \ 3; RUN: "-aa-pipeline=basic-aa,globals-aa" 2>&1 | FileCheck %s 4define void @i32_subscript(ptr %a) { 5; CHECK-LABEL: 'i32_subscript' 6; CHECK-NEXT: Src: %0 = load i32, ptr %a.addr, align 4 --> Dst: %0 = load i32, ptr %a.addr, align 4 7; CHECK-NEXT: da analyze - none! 8; CHECK-NEXT: Src: %0 = load i32, ptr %a.addr, align 4 --> Dst: store i32 %1, ptr %a.addr.2, align 4 9; CHECK-NEXT: da analyze - anti [*|<]! 10; CHECK-NEXT: Src: store i32 %1, ptr %a.addr.2, align 4 --> Dst: store i32 %1, ptr %a.addr.2, align 4 11; CHECK-NEXT: da analyze - consistent output [S]! 12; 13entry: 14 br label %for.body 15 16for.body: 17 %i = phi i32 [ 0, %entry ], [ %i.inc, %for.body ] 18 %a.addr = getelementptr i32, ptr %a, i32 %i 19 %a.addr.2 = getelementptr i32, ptr %a, i32 5 20 %0 = load i32, ptr %a.addr, align 4 21 %1 = add i32 %0, 1 22 store i32 %1, ptr %a.addr.2, align 4 23 %i.inc = add nsw i32 %i, 1 24 %i.inc.ext = sext i32 %i to i64 25 %exitcond = icmp ne i64 %i.inc.ext, 100 26 br i1 %exitcond, label %for.body, label %for.end 27 28for.end: 29 ret void 30} 31 32; Test for a bug, which caused an assert in ScalarEvolution because 33; the Dependence Analyzer attempted to zero extend a type to a smaller 34; type. 35 36; void t(unsigned int *a, unsigned int n) { 37; for (unsigned int i = 0; i != n; i++) { 38; a[(unsigned short)i] = g; 39; }} 40 41@g = common global i32 0, align 4 42 43define void @t(ptr noalias %a, i32 %n) nounwind { 44; CHECK-LABEL: 't' 45; CHECK-NEXT: Src: %0 = load i32, ptr @g, align 4 --> Dst: %0 = load i32, ptr @g, align 4 46; CHECK-NEXT: da analyze - consistent input [S]! 47; CHECK-NEXT: Src: %0 = load i32, ptr @g, align 4 --> Dst: store i32 %0, ptr %arrayidx, align 4 48; CHECK-NEXT: da analyze - none! 49; CHECK-NEXT: Src: store i32 %0, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %arrayidx, align 4 50; CHECK-NEXT: da analyze - output [*]! 51; 52entry: 53 %cmp1 = icmp eq i32 %n, 0 54 br i1 %cmp1, label %for.end, label %for.body 55 56for.body: 57 %i.02 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 58 %0 = load i32, ptr @g, align 4 59 %idxprom = and i32 %i.02, 65535 60 %arrayidx = getelementptr inbounds i32, ptr %a, i32 %idxprom 61 store i32 %0, ptr %arrayidx, align 4 62 %inc = add i32 %i.02, 1 63 %cmp = icmp eq i32 %inc, %n 64 br i1 %cmp, label %for.end, label %for.body 65 66for.end: 67 ret void 68} 69 70define void @i16_wrap(ptr %a) { 71; CHECK-LABEL: 'i16_wrap' 72; CHECK-NEXT: Src: %0 = load i64, ptr %idx, align 4 --> Dst: %0 = load i64, ptr %idx, align 4 73; CHECK-NEXT: da analyze - input [*]! 74; CHECK-NEXT: Src: %0 = load i64, ptr %idx, align 4 --> Dst: store i64 %1, ptr %idx, align 4 75; CHECK-NEXT: da analyze - anti [*|<]! 76; CHECK-NEXT: Src: store i64 %1, ptr %idx, align 4 --> Dst: store i64 %1, ptr %idx, align 4 77; CHECK-NEXT: da analyze - output [*]! 78; 79entry: 80 br label %for.body 81for.body: 82 %i = phi i64 [0, %entry], [%i.inc, %for.inc] 83 %i.tr = trunc i64 %i to i16 84 %idx = getelementptr i64, ptr %a, i16 %i.tr 85 %0 = load i64, ptr %idx 86 %1 = add i64 %0, 1 87store i64 %1, ptr %idx 88 br label %for.inc 89 90for.inc: 91 %i.inc = add nuw i64 %i, 1 92 %cmp = icmp ult i64 %i.inc, 17179869184 93 br i1 %cmp, label %for.body, label %for.end 94for.end: 95 ret void 96} 97 98define void @i8_stride_wrap(ptr noalias %a, ptr noalias %b) { 99; CHECK-LABEL: 'i8_stride_wrap' 100; CHECK-NEXT: Src: %0 = load i32, ptr %idx, align 4 --> Dst: %0 = load i32, ptr %idx, align 4 101; CHECK-NEXT: da analyze - consistent input [S]! 102; CHECK-NEXT: Src: %0 = load i32, ptr %idx, align 4 --> Dst: store i32 %1, ptr %idx.2, align 4 103; CHECK-NEXT: da analyze - none! 104; CHECK-NEXT: Src: store i32 %1, ptr %idx.2, align 4 --> Dst: store i32 %1, ptr %idx.2, align 4 105; CHECK-NEXT: da analyze - none! 106; 107entry: 108 br label %for.body 109for.body: 110 %i = phi i32 [1,%entry], [%i.inc, %for.inc] 111 %i.tr = trunc i32 %i to i8 112 %idx = getelementptr i32, ptr %a, i8 %i.tr 113 %idx.2 = getelementptr i32, ptr %b, i32 %i 114 %0 = load i32, ptr %idx, align 4 115 %1 = add i32 %0, 1 116 store i32 %1, ptr %idx.2, align 4 117 br label %for.inc 118 119for.inc: 120 %i.inc = add nsw i32 %i, 256 121 %exitcond = icmp ult i32 %i, 65536 122 br i1 %exitcond, label %for.body, label %for.end 123 124for.end: 125 ret void 126} 127