; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6 ; RUN: opt < %s -disable-output "-passes=print" -da-enable-dependence-test=all 2>&1 \ ; RUN: | FileCheck %s --check-prefix=CHECK-ALL ; RUN: opt < %s -disable-output "-passes=print" -da-enable-dependence-test=strong-siv 2>&1 \ ; RUN: | FileCheck %s --check-prefix=CHECK-STRONG-SIV ; RUN: opt < %s -disable-output "-passes=print" -da-enable-dependence-test=weak-crossing-siv 2>&1 \ ; RUN: | FileCheck %s --check-prefix=CHECK-WEAK-CROSSING-SIV ; RUN: opt < %s -disable-output "-passes=print" -da-enable-dependence-test=exact-siv 2>&1 \ ; RUN: | FileCheck %s --check-prefix=CHECK-EXACT-SIV ; RUN: opt < %s -disable-output "-passes=print" -da-enable-dependence-test=weak-zero-siv 2>&1 \ ; RUN: | FileCheck %s --check-prefix=CHECK-WEAK-ZERO-SIV ; RUN: opt < %s -disable-output "-passes=print" -da-enable-dependence-test=exact-rdiv 2>&1 \ ; RUN: | FileCheck %s --check-prefix=CHECK-EXACT-RDIV ; RUN: opt < %s -disable-output "-passes=print" -da-enable-dependence-test=gcd-miv 2>&1 \ ; RUN: | FileCheck %s --check-prefix=CHECK-GCD-MIV ; RUN: opt < %s -disable-output "-passes=print" -da-enable-dependence-test=banerjee-miv 2>&1 \ ; RUN: | FileCheck %s --check-prefix=CHECK-BANERJEE-MIV ; for (i = 0; i < 10; i++) ; a[i] = 0; define void @strong_siv(ptr %a) { ; CHECK-ALL-LABEL: 'strong_siv' ; CHECK-ALL-NEXT: Src: store i8 0, ptr %gep, align 1 --> Dst: store i8 0, ptr %gep, align 1 ; CHECK-ALL-NEXT: da analyze - none! ; ; CHECK-STRONG-SIV-LABEL: 'strong_siv' ; CHECK-STRONG-SIV-NEXT: Src: store i8 0, ptr %gep, align 1 --> Dst: store i8 0, ptr %gep, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - none! ; ; CHECK-WEAK-CROSSING-SIV-LABEL: 'strong_siv' ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 0, ptr %gep, align 1 --> Dst: store i8 0, ptr %gep, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [*]! ; ; CHECK-EXACT-SIV-LABEL: 'strong_siv' ; CHECK-EXACT-SIV-NEXT: Src: store i8 0, ptr %gep, align 1 --> Dst: store i8 0, ptr %gep, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - none! ; ; CHECK-WEAK-ZERO-SIV-LABEL: 'strong_siv' ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 0, ptr %gep, align 1 --> Dst: store i8 0, ptr %gep, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [*]! ; ; CHECK-EXACT-RDIV-LABEL: 'strong_siv' ; CHECK-EXACT-RDIV-NEXT: Src: store i8 0, ptr %gep, align 1 --> Dst: store i8 0, ptr %gep, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - output [*]! ; ; CHECK-GCD-MIV-LABEL: 'strong_siv' ; CHECK-GCD-MIV-NEXT: Src: store i8 0, ptr %gep, align 1 --> Dst: store i8 0, ptr %gep, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - output [*]! ; ; CHECK-BANERJEE-MIV-LABEL: 'strong_siv' ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 0, ptr %gep, align 1 --> Dst: store i8 0, ptr %gep, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [*]! ; entry: br label %loop loop: %i = phi i64 [ 0, %entry ], [ %i.inc, %loop ] %gep = getelementptr i8, ptr %a, i64 %i store i8 0, ptr %gep %i.inc = add i64 %i, 1 %ec = icmp eq i64 %i.inc, 10 br i1 %ec, label %exit, label %loop exit: ret void } ; for (i = 0; i < 10; i++) { ; a[i] = 1; ; a[10 - i] = 2; ; } define void @weak_crossing_siv(ptr %a) { ; CHECK-ALL-LABEL: 'weak_crossing_siv' ; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-ALL-NEXT: da analyze - none! ; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-ALL-NEXT: da analyze - output [*|<]! ; CHECK-ALL-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-ALL-NEXT: da analyze - none! ; ; CHECK-STRONG-SIV-LABEL: 'weak_crossing_siv' ; CHECK-STRONG-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - none! ; CHECK-STRONG-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - output [*|<]! ; CHECK-STRONG-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - none! ; ; CHECK-WEAK-CROSSING-SIV-LABEL: 'weak_crossing_siv' ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [*]! ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [*|<]! ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [*]! ; ; CHECK-EXACT-SIV-LABEL: 'weak_crossing_siv' ; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - none! ; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - output [*|<]! ; CHECK-EXACT-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - none! ; ; CHECK-WEAK-ZERO-SIV-LABEL: 'weak_crossing_siv' ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [*]! ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [*|<]! ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [*]! ; ; CHECK-EXACT-RDIV-LABEL: 'weak_crossing_siv' ; CHECK-EXACT-RDIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - output [*]! ; CHECK-EXACT-RDIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - output [*|<]! ; CHECK-EXACT-RDIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - output [*]! ; ; CHECK-GCD-MIV-LABEL: 'weak_crossing_siv' ; CHECK-GCD-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - output [*]! ; CHECK-GCD-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - output [*|<]! ; CHECK-GCD-MIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - output [*]! ; ; CHECK-BANERJEE-MIV-LABEL: 'weak_crossing_siv' ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [*]! ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [*|<]! ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [*]! ; entry: br label %loop loop: %i = phi i64 [ 0, %entry ], [ %i.inc, %loop ] %i.sub10 = sub i64 10, %i %gep.0 = getelementptr i8, ptr %a, i64 %i %gep.1 = getelementptr i8, ptr %a, i64 %i.sub10 store i8 1, ptr %gep.0 store i8 2, ptr %gep.1 %i.inc = add i64 %i, 1 %ec = icmp eq i64 %i.inc, 10 br i1 %ec, label %exit, label %loop exit: ret void } ; for (i = 0; i < 10; i++) { ; a[2 * i + 0] = 1; ; a[2 * i + 1] = 2; ; } define void @exact_siv(ptr %a) { ; CHECK-ALL-LABEL: 'exact_siv' ; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-ALL-NEXT: da analyze - none! ; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-ALL-NEXT: da analyze - none! ; CHECK-ALL-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-ALL-NEXT: da analyze - none! ; ; CHECK-STRONG-SIV-LABEL: 'exact_siv' ; CHECK-STRONG-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - none! ; CHECK-STRONG-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - none! ; CHECK-STRONG-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - none! ; ; CHECK-WEAK-CROSSING-SIV-LABEL: 'exact_siv' ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [*]! ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [*|<]! ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [*]! ; ; CHECK-EXACT-SIV-LABEL: 'exact_siv' ; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - none! ; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - none! ; CHECK-EXACT-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - none! ; ; CHECK-WEAK-ZERO-SIV-LABEL: 'exact_siv' ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [*]! ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [*|<]! ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [*]! ; ; CHECK-EXACT-RDIV-LABEL: 'exact_siv' ; CHECK-EXACT-RDIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - output [*]! ; CHECK-EXACT-RDIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - output [*|<]! ; CHECK-EXACT-RDIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - output [*]! ; ; CHECK-GCD-MIV-LABEL: 'exact_siv' ; CHECK-GCD-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - output [*]! ; CHECK-GCD-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - output [*|<]! ; CHECK-GCD-MIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - output [*]! ; ; CHECK-BANERJEE-MIV-LABEL: 'exact_siv' ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [*]! ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [*|<]! ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [*]! ; entry: br label %loop loop: %i = phi i64 [ 0, %entry ], [ %i.inc, %loop ] %offset.0 = mul i64 2, %i %offset.1 = add i64 %offset.0, 1 %gep.0 = getelementptr i8, ptr %a, i64 %offset.0 %gep.1 = getelementptr i8, ptr %a, i64 %offset.1 store i8 1, ptr %gep.0 store i8 2, ptr %gep.1 %i.inc = add i64 %i, 1 %ec = icmp eq i64 %i.inc, 10 br i1 %ec, label %exit, label %loop exit: ret void } ; for (i = 0; i < 10; i++) { ; a[10] = 1; ; a[i] = 2; ; } define void @weak_zero_siv(ptr %a) { ; CHECK-ALL-LABEL: 'weak_zero_siv' ; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-ALL-NEXT: da analyze - output [S]! ; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-ALL-NEXT: da analyze - none! ; CHECK-ALL-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-ALL-NEXT: da analyze - none! ; ; CHECK-STRONG-SIV-LABEL: 'weak_zero_siv' ; CHECK-STRONG-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - output [S]! ; CHECK-STRONG-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - none! ; CHECK-STRONG-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - none! ; ; CHECK-WEAK-CROSSING-SIV-LABEL: 'weak_zero_siv' ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [S]! ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - none! ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [*]! ; ; CHECK-EXACT-SIV-LABEL: 'weak_zero_siv' ; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - output [S]! ; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - none! ; CHECK-EXACT-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - none! ; ; CHECK-WEAK-ZERO-SIV-LABEL: 'weak_zero_siv' ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [S]! ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - none! ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [*]! ; ; CHECK-EXACT-RDIV-LABEL: 'weak_zero_siv' ; CHECK-EXACT-RDIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - output [S]! ; CHECK-EXACT-RDIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - none! ; CHECK-EXACT-RDIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - output [*]! ; ; CHECK-GCD-MIV-LABEL: 'weak_zero_siv' ; CHECK-GCD-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - output [S]! ; CHECK-GCD-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - none! ; CHECK-GCD-MIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - output [*]! ; ; CHECK-BANERJEE-MIV-LABEL: 'weak_zero_siv' ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [S]! ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - none! ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [*]! ; entry: br label %loop loop: %i = phi i64 [ 0, %entry ], [ %i.inc, %loop ] %gep.0 = getelementptr i8, ptr %a, i64 10 %gep.1 = getelementptr i8, ptr %a, i64 %i store i8 1, ptr %gep.0 store i8 2, ptr %gep.1 %i.inc = add i64 %i, 1 %ec = icmp eq i64 %i.inc, 10 br i1 %ec, label %exit, label %loop exit: ret void } ; for (i = 0; i < 10; i++) ; a[2 * i + 0] = 1; ; for (i = 0; i < 20; i++) ; a[2 * i + 1] = 2; define void @exact_rdiv(ptr %a) { ; CHECK-ALL-LABEL: 'exact_rdiv' ; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-ALL-NEXT: da analyze - none! ; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-ALL-NEXT: da analyze - none! ; CHECK-ALL-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-ALL-NEXT: da analyze - none! ; ; CHECK-STRONG-SIV-LABEL: 'exact_rdiv' ; CHECK-STRONG-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - none! ; CHECK-STRONG-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - output [|<]! ; CHECK-STRONG-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - none! ; ; CHECK-WEAK-CROSSING-SIV-LABEL: 'exact_rdiv' ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [*]! ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [|<]! ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [*]! ; ; CHECK-EXACT-SIV-LABEL: 'exact_rdiv' ; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - none! ; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - output [|<]! ; CHECK-EXACT-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - none! ; ; CHECK-WEAK-ZERO-SIV-LABEL: 'exact_rdiv' ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [*]! ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [|<]! ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [*]! ; ; CHECK-EXACT-RDIV-LABEL: 'exact_rdiv' ; CHECK-EXACT-RDIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - output [*]! ; CHECK-EXACT-RDIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - none! ; CHECK-EXACT-RDIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - output [*]! ; ; CHECK-GCD-MIV-LABEL: 'exact_rdiv' ; CHECK-GCD-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - output [*]! ; CHECK-GCD-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - none! ; CHECK-GCD-MIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - output [*]! ; ; CHECK-BANERJEE-MIV-LABEL: 'exact_rdiv' ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [*]! ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [|<]! ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [*]! ; entry: br label %loop.0 loop.0: %i.0 = phi i64 [ 0, %entry ], [ %i.0.inc, %loop.0 ] %offset.0 = phi i64 [ 0, %entry ], [ %offset.0.next, %loop.0 ] %gep.0 = getelementptr i8, ptr %a, i64 %offset.0 store i8 1, ptr %gep.0 %i.0.inc = add i64 %i.0, 1 %offset.0.next = add i64 %offset.0, 2 %ec.0 = icmp eq i64 %i.0.inc, 10 br i1 %ec.0, label %loop.1, label %loop.0 loop.1: %i.1 = phi i64 [ 0, %loop.0 ], [ %i.1.inc, %loop.1 ] %offset.1 = phi i64 [ 1, %loop.0 ], [ %offset.1.next, %loop.1 ] %gep.1 = getelementptr i8, ptr %a, i64 %offset.1 store i8 2, ptr %gep.1 %i.1.inc = add i64 %i.1, 1 %offset.1.next = add i64 %offset.1, 2 %ec.1 = icmp eq i64 %i.1.inc, 20 br i1 %ec.1, label %exit, label %loop.1 exit: ret void } ; for (i = 0; i < 10; i++) ; a[i + 1] = 1; ; for (i = 0; i < 20; i++) ; a[-i] = 2; define void @symbolic_rdiv(ptr %a) { ; CHECK-ALL-LABEL: 'symbolic_rdiv' ; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-ALL-NEXT: da analyze - none! ; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-ALL-NEXT: da analyze - none! ; CHECK-ALL-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-ALL-NEXT: da analyze - none! ; ; CHECK-STRONG-SIV-LABEL: 'symbolic_rdiv' ; CHECK-STRONG-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - none! ; CHECK-STRONG-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - none! ; CHECK-STRONG-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - none! ; ; CHECK-WEAK-CROSSING-SIV-LABEL: 'symbolic_rdiv' ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [*]! ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - none! ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [*]! ; ; CHECK-EXACT-SIV-LABEL: 'symbolic_rdiv' ; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - none! ; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - none! ; CHECK-EXACT-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - none! ; ; CHECK-WEAK-ZERO-SIV-LABEL: 'symbolic_rdiv' ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [*]! ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - none! ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [*]! ; ; CHECK-EXACT-RDIV-LABEL: 'symbolic_rdiv' ; CHECK-EXACT-RDIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - output [*]! ; CHECK-EXACT-RDIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - none! ; CHECK-EXACT-RDIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - output [*]! ; ; CHECK-GCD-MIV-LABEL: 'symbolic_rdiv' ; CHECK-GCD-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - output [*]! ; CHECK-GCD-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - none! ; CHECK-GCD-MIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - output [*]! ; ; CHECK-BANERJEE-MIV-LABEL: 'symbolic_rdiv' ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [*]! ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - none! ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [*]! ; entry: br label %loop.0 loop.0: %i.0 = phi i64 [ 0, %entry ], [ %i.0.inc, %loop.0 ] %i.0.inc = add i64 %i.0, 1 %gep.0 = getelementptr i8, ptr %a, i64 %i.0.inc store i8 1, ptr %gep.0 %ec.0 = icmp eq i64 %i.0.inc, 10 br i1 %ec.0, label %loop.1, label %loop.0 loop.1: %i.1 = phi i64 [ 0, %loop.0 ], [ %i.1.inc, %loop.1 ] %i.1.neg = sub i64 0, %i.1 %gep.1 = getelementptr i8, ptr %a, i64 %i.1.neg store i8 2, ptr %gep.1 %i.1.inc = add i64 %i.1, 1 %ec.1 = icmp eq i64 %i.1.inc, 20 br i1 %ec.1, label %exit, label %loop.1 exit: ret void } ; for (i = 0; i < 10; i++) ; for (j = 0; j < 10; j++) { ; a[2*i + 2*j + 0] = 1; ; a[2*i + 2*j + 1] = 2; ; } define void @gcd_miv(ptr %a) { ; CHECK-ALL-LABEL: 'gcd_miv' ; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-ALL-NEXT: da analyze - output [* *]! ; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-ALL-NEXT: da analyze - none! ; CHECK-ALL-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-ALL-NEXT: da analyze - output [* *]! ; ; CHECK-STRONG-SIV-LABEL: 'gcd_miv' ; CHECK-STRONG-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - output [* *]! ; CHECK-STRONG-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - output [* *|<]! ; CHECK-STRONG-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - output [* *]! ; ; CHECK-WEAK-CROSSING-SIV-LABEL: 'gcd_miv' ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [* *]! ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [* *|<]! ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [* *]! ; ; CHECK-EXACT-SIV-LABEL: 'gcd_miv' ; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - output [* *]! ; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - output [* *|<]! ; CHECK-EXACT-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - output [* *]! ; ; CHECK-WEAK-ZERO-SIV-LABEL: 'gcd_miv' ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [* *]! ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [* *|<]! ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [* *]! ; ; CHECK-EXACT-RDIV-LABEL: 'gcd_miv' ; CHECK-EXACT-RDIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - output [* *]! ; CHECK-EXACT-RDIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - output [* *|<]! ; CHECK-EXACT-RDIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - output [* *]! ; ; CHECK-GCD-MIV-LABEL: 'gcd_miv' ; CHECK-GCD-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - output [* *]! ; CHECK-GCD-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - none! ; CHECK-GCD-MIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - output [* *]! ; ; CHECK-BANERJEE-MIV-LABEL: 'gcd_miv' ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [* *]! ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [<> <>]! ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [* *]! ; entry: br label %loop.i.header loop.i.header: %i = phi i64 [ 0, %entry ], [ %i.inc, %loop.i.latch ] %offset.0.i = phi i64 [ 0, %entry ], [ %offset.0.i.next, %loop.i.latch ] %offset.1.i = phi i64 [ 1, %entry ], [ %offset.1.i.next, %loop.i.latch ] br label %loop.j loop.j: %j = phi i64 [ 0, %loop.i.header ], [ %j.inc, %loop.j ] %offset.0 = phi i64 [ %offset.0.i, %loop.i.header ], [ %offset.0.next, %loop.j ] %offset.1 = phi i64 [ %offset.1.i, %loop.i.header ], [ %offset.1.next, %loop.j ] %gep.0 = getelementptr i8, ptr %a, i64 %offset.0 %gep.1 = getelementptr i8, ptr %a, i64 %offset.1 store i8 1, ptr %gep.0 store i8 2, ptr %gep.1 %j.inc = add i64 %j, 1 %offset.0.next = add i64 %offset.0, 2 %offset.1.next = add i64 %offset.1, 2 %ec.j = icmp eq i64 %j.inc, 10 br i1 %ec.j, label %loop.i.latch, label %loop.j loop.i.latch: %i.inc = add i64 %i, 1 %offset.0.i.next = add i64 %offset.0.i, 2 %offset.1.i.next = add i64 %offset.1.i, 2 %ec.i = icmp eq i64 %i.inc, 10 br i1 %ec.i, label %exit, label %loop.i.header exit: ret void } ; for (i = 0; i < 10; i++) ; for (j = 0; j < 10; j++) { ; a[i + j] = 1; ; a[i + j + 100] = 2; ; } define void @banerjee_miv(ptr %a) { ; CHECK-ALL-LABEL: 'banerjee_miv' ; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-ALL-NEXT: da analyze - output [* *]! ; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-ALL-NEXT: da analyze - none! ; CHECK-ALL-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-ALL-NEXT: da analyze - output [* *]! ; ; CHECK-STRONG-SIV-LABEL: 'banerjee_miv' ; CHECK-STRONG-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - output [* *]! ; CHECK-STRONG-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - none! ; CHECK-STRONG-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-STRONG-SIV-NEXT: da analyze - output [* *]! ; ; CHECK-WEAK-CROSSING-SIV-LABEL: 'banerjee_miv' ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [* *]! ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - none! ; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [* *]! ; ; CHECK-EXACT-SIV-LABEL: 'banerjee_miv' ; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - output [* *]! ; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - none! ; CHECK-EXACT-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-SIV-NEXT: da analyze - output [* *]! ; ; CHECK-WEAK-ZERO-SIV-LABEL: 'banerjee_miv' ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [* *]! ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - none! ; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [* *]! ; ; CHECK-EXACT-RDIV-LABEL: 'banerjee_miv' ; CHECK-EXACT-RDIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - output [* *]! ; CHECK-EXACT-RDIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - none! ; CHECK-EXACT-RDIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-EXACT-RDIV-NEXT: da analyze - output [* *]! ; ; CHECK-GCD-MIV-LABEL: 'banerjee_miv' ; CHECK-GCD-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - output [* *]! ; CHECK-GCD-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - none! ; CHECK-GCD-MIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-GCD-MIV-NEXT: da analyze - output [* *]! ; ; CHECK-BANERJEE-MIV-LABEL: 'banerjee_miv' ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [* *]! ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - none! ; CHECK-BANERJEE-MIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1 ; CHECK-BANERJEE-MIV-NEXT: da analyze - output [* *]! ; entry: br label %loop.i.header loop.i.header: %i = phi i64 [ 0, %entry ], [ %i.inc, %loop.i.latch ] br label %loop.j loop.j: %j = phi i64 [ 0, %loop.i.header ], [ %j.inc, %loop.j ] %offset.0 = add i64 %i, %j %offset.1 = add i64 %offset.0, 100 %gep.0 = getelementptr i8, ptr %a, i64 %offset.0 %gep.1 = getelementptr i8, ptr %a, i64 %offset.1 store i8 1, ptr %gep.0 store i8 2, ptr %gep.1 %j.inc = add i64 %j, 1 %ec.j = icmp eq i64 %j.inc, 10 br i1 %ec.j, label %loop.i.latch, label %loop.j loop.i.latch: %i.inc = add i64 %i, 1 %ec.i = icmp eq i64 %i.inc, 10 br i1 %ec.i, label %exit, label %loop.i.header exit: ret void }