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>" -aa-pipeline=basic-aa 2>&1 \ 3; RUN: | FileCheck %s 4 5; Test that the dependence analysis generates the correct results when using 6; an aliased object that points to a different element in the same array. 7; PR33567 - https://bugs.llvm.org/show_bug.cgi?id=33567 8 9; void test1(int *A, int *B, int N) { 10; int *top = A; 11; int *bot = A + N/2; 12; for (int i = 0; i < N; i++) 13; B[i] = top[i] + bot[i]; 14; } 15 16define void @test1(ptr nocapture %A, ptr nocapture %B, i32 %N) #0 { 17; CHECK-LABEL: 'test1' 18; CHECK-NEXT: Src: %0 = load i32, ptr %gep.0, align 4 --> Dst: %0 = load i32, ptr %gep.0, align 4 19; CHECK-NEXT: da analyze - none! 20; CHECK-NEXT: Src: %0 = load i32, ptr %gep.0, align 4 --> Dst: %1 = load i32, ptr %gep.1, align 4 21; CHECK-NEXT: da analyze - input [*|<]! 22; CHECK-NEXT: Src: %0 = load i32, ptr %gep.0, align 4 --> Dst: store i32 %add, ptr %gep.B, align 4 23; CHECK-NEXT: da analyze - confused! 24; CHECK-NEXT: Src: %1 = load i32, ptr %gep.1, align 4 --> Dst: %1 = load i32, ptr %gep.1, align 4 25; CHECK-NEXT: da analyze - none! 26; CHECK-NEXT: Src: %1 = load i32, ptr %gep.1, align 4 --> Dst: store i32 %add, ptr %gep.B, align 4 27; CHECK-NEXT: da analyze - confused! 28; CHECK-NEXT: Src: store i32 %add, ptr %gep.B, align 4 --> Dst: store i32 %add, ptr %gep.B, align 4 29; CHECK-NEXT: da analyze - none! 30; 31entry: 32 %cmp9 = icmp sgt i32 %N, 0 33 br i1 %cmp9, label %for.body.lr.ph, label %for.end 34 35for.body.lr.ph: 36 %div = sdiv i32 %N, 2 37 %bot.gep = getelementptr i32, ptr %A, i32 %div 38 br label %for.body 39 40for.body: 41 %i = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ] 42 %gep.0 = getelementptr i32, ptr %A, i32 %i 43 %gep.1 = getelementptr i32, ptr %bot.gep, i32 %i 44 %gep.B = getelementptr i32, ptr %B, i32 %i 45 %0 = load i32, ptr %gep.0, align 4 46 %1 = load i32, ptr %gep.1, align 4 47 %add = add nsw i32 %1, %0 48 store i32 %add, ptr %gep.B, align 4 49 %inc = add nsw i32 %i, 1 50 %exitcond = icmp eq i32 %inc, %N 51 br i1 %exitcond, label %for.end, label %for.body 52 53for.end: 54 ret void 55} 56 57 58; void test2(int *A, unsigned n) { 59; int *B = A + 1; 60; for (unsigned i = 0; i < n; ++i) { 61; A[i] = B[i]; 62; } 63; } 64 65define void @test2(ptr, i32) #3 { 66; CHECK-LABEL: 'test2' 67; CHECK-NEXT: Src: %10 = load i32, ptr %9, align 4 --> Dst: %10 = load i32, ptr %9, align 4 68; CHECK-NEXT: da analyze - none! 69; CHECK-NEXT: Src: %10 = load i32, ptr %9, align 4 --> Dst: store i32 %10, ptr %12, align 4 70; CHECK-NEXT: da analyze - consistent anti [1]! 71; CHECK-NEXT: Src: store i32 %10, ptr %12, align 4 --> Dst: store i32 %10, ptr %12, align 4 72; CHECK-NEXT: da analyze - none! 73; 74 %3 = getelementptr inbounds i32, ptr %0, i64 1 75 br label %4 76 77; <label>:4: 78 %.0 = phi i32 [ 0, %2 ], [ %14, %13 ] 79 %5 = sub i32 %1, 1 80 %6 = icmp ult i32 %.0, %5 81 br i1 %6, label %7, label %15 82 83; <label>:7: 84 %8 = zext i32 %.0 to i64 85 %9 = getelementptr inbounds i32, ptr %3, i64 %8 86 %10 = load i32, ptr %9, align 4 87 %11 = zext i32 %.0 to i64 88 %12 = getelementptr inbounds i32, ptr %0, i64 %11 89 store i32 %10, ptr %12, align 4 90 br label %13 91 92; <label>:13: 93 %14 = add i32 %.0, 1 94 br label %4 95 96; <label>:15: 97 ret void 98} 99