Skip to content

Commit 6482263

Browse files
committed
[DA] Check if the multiplication overflows in strong SIV test
1 parent af34890 commit 6482263

File tree

2 files changed

+218
-1
lines changed

2 files changed

+218
-1
lines changed

llvm/lib/Analysis/DependenceAnalysis.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1582,6 +1582,15 @@ static const SCEV *minusSCEVNoSignedOverflow(const SCEV *A, const SCEV *B,
15821582
return nullptr;
15831583
}
15841584

1585+
/// Returns \p A * \p B if it guaranteed not to signed wrap. Otherwise returns
1586+
/// nullptr. \p A and \p B must have the same integer type.
1587+
static const SCEV *mulSCEVNoSignedOverflow(const SCEV *A, const SCEV *B,
1588+
ScalarEvolution &SE) {
1589+
if (SE.willNotOverflow(Instruction::Mul, /*Signed=*/true, A, B))
1590+
return SE.getMulExpr(A, B);
1591+
return nullptr;
1592+
}
1593+
15851594
/// Returns the absolute value of \p A. In the context of dependence analysis,
15861595
/// we need an absolute value in a mathematical sense. If \p A is the signed
15871596
/// minimum value, we cannot represent it unless extending the original type.
@@ -1697,7 +1706,9 @@ bool DependenceInfo::strongSIVtest(const SCEV *Coeff, const SCEV *SrcConst,
16971706
const SCEV *AbsCoeff = absSCEVNoSignedOverflow(Coeff, *SE);
16981707
if (!AbsDelta || !AbsCoeff)
16991708
return false;
1700-
const SCEV *Product = SE->getMulExpr(UpperBound, AbsCoeff);
1709+
const SCEV *Product = mulSCEVNoSignedOverflow(UpperBound, AbsCoeff, *SE);
1710+
if (!Product)
1711+
return false;
17011712
return isKnownPredicate(CmpInst::ICMP_SGT, AbsDelta, Product);
17021713
}();
17031714
if (IsDeltaLarge) {

llvm/test/Analysis/DependenceAnalysis/StrongSIV.ll

Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
22
; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \
33
; RUN: | FileCheck %s
4+
; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa -da-enable-dependence-test=strong-siv 2>&1 \
5+
; RUN: | FileCheck %s --check-prefix=CHECK-STRONG-SIV
46

57
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
68
target triple = "x86_64-apple-macosx10.6.0"
@@ -25,6 +27,20 @@ define void @strong0(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
2527
; CHECK-NEXT: Src: store i32 %2, ptr %B.addr.02, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 4
2628
; CHECK-NEXT: da analyze - none!
2729
;
30+
; CHECK-STRONG-SIV-LABEL: 'strong0'
31+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %1, ptr %arrayidx, align 4 --> Dst: store i32 %1, ptr %arrayidx, align 4
32+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
33+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %1, ptr %arrayidx, align 4 --> Dst: %2 = load i32, ptr %arrayidx3, align 4
34+
; CHECK-STRONG-SIV-NEXT: da analyze - consistent flow [2]!
35+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %1, ptr %arrayidx, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 4
36+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
37+
; CHECK-STRONG-SIV-NEXT: Src: %2 = load i32, ptr %arrayidx3, align 4 --> Dst: %2 = load i32, ptr %arrayidx3, align 4
38+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
39+
; CHECK-STRONG-SIV-NEXT: Src: %2 = load i32, ptr %arrayidx3, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 4
40+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
41+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %2, ptr %B.addr.02, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 4
42+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
43+
;
2844
entry:
2945
%cmp1 = icmp sgt i64 %n, 0
3046
br i1 %cmp1, label %for.body.preheader, label %for.end
@@ -74,6 +90,20 @@ define void @strong1(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
7490
; CHECK-NEXT: Src: store i32 %1, ptr %B.addr.02, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4
7591
; CHECK-NEXT: da analyze - none!
7692
;
93+
; CHECK-STRONG-SIV-LABEL: 'strong1'
94+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv2, ptr %arrayidx, align 4 --> Dst: store i32 %conv2, ptr %arrayidx, align 4
95+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
96+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv2, ptr %arrayidx, align 4 --> Dst: %1 = load i32, ptr %arrayidx3, align 4
97+
; CHECK-STRONG-SIV-NEXT: da analyze - consistent flow [2]!
98+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv2, ptr %arrayidx, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4
99+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
100+
; CHECK-STRONG-SIV-NEXT: Src: %1 = load i32, ptr %arrayidx3, align 4 --> Dst: %1 = load i32, ptr %arrayidx3, align 4
101+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
102+
; CHECK-STRONG-SIV-NEXT: Src: %1 = load i32, ptr %arrayidx3, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4
103+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
104+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %1, ptr %B.addr.02, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4
105+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
106+
;
77107
entry:
78108
%cmp1 = icmp sgt i32 %n, 0
79109
br i1 %cmp1, label %for.body.preheader, label %for.end
@@ -124,6 +154,20 @@ define void @strong2(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
124154
; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
125155
; CHECK-NEXT: da analyze - none!
126156
;
157+
; CHECK-STRONG-SIV-LABEL: 'strong2'
158+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
159+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
160+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
161+
; CHECK-STRONG-SIV-NEXT: da analyze - consistent flow [2]!
162+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
163+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
164+
; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
165+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
166+
; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
167+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
168+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
169+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
170+
;
127171
entry:
128172
%cmp1 = icmp eq i64 %n, 0
129173
br i1 %cmp1, label %for.end, label %for.body.preheader
@@ -173,6 +217,20 @@ define void @strong3(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
173217
; CHECK-NEXT: Src: store i32 %2, ptr %B.addr.02, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 4
174218
; CHECK-NEXT: da analyze - none!
175219
;
220+
; CHECK-STRONG-SIV-LABEL: 'strong3'
221+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %1, ptr %arrayidx, align 4 --> Dst: store i32 %1, ptr %arrayidx, align 4
222+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
223+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %1, ptr %arrayidx, align 4 --> Dst: %2 = load i32, ptr %arrayidx2, align 4
224+
; CHECK-STRONG-SIV-NEXT: da analyze - consistent flow [2]!
225+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %1, ptr %arrayidx, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 4
226+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
227+
; CHECK-STRONG-SIV-NEXT: Src: %2 = load i32, ptr %arrayidx2, align 4 --> Dst: %2 = load i32, ptr %arrayidx2, align 4
228+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
229+
; CHECK-STRONG-SIV-NEXT: Src: %2 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 4
230+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
231+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %2, ptr %B.addr.02, align 4 --> Dst: store i32 %2, ptr %B.addr.02, align 4
232+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
233+
;
176234
entry:
177235
%cmp1 = icmp sgt i32 %n, 0
178236
br i1 %cmp1, label %for.body.preheader, label %for.end
@@ -223,6 +281,20 @@ define void @strong4(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
223281
; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
224282
; CHECK-NEXT: da analyze - none!
225283
;
284+
; CHECK-STRONG-SIV-LABEL: 'strong4'
285+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
286+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
287+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
288+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
289+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
290+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
291+
; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
292+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
293+
; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
294+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
295+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
296+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
297+
;
226298
entry:
227299
br label %for.body
228300

@@ -265,6 +337,20 @@ define void @strong5(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
265337
; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
266338
; CHECK-NEXT: da analyze - none!
267339
;
340+
; CHECK-STRONG-SIV-LABEL: 'strong5'
341+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
342+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
343+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
344+
; CHECK-STRONG-SIV-NEXT: da analyze - consistent flow [19]!
345+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
346+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
347+
; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
348+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
349+
; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
350+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
351+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
352+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
353+
;
268354
entry:
269355
br label %for.body
270356

@@ -307,6 +393,20 @@ define void @strong6(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
307393
; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
308394
; CHECK-NEXT: da analyze - none!
309395
;
396+
; CHECK-STRONG-SIV-LABEL: 'strong6'
397+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
398+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
399+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
400+
; CHECK-STRONG-SIV-NEXT: da analyze - consistent flow [3]!
401+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
402+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
403+
; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
404+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
405+
; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
406+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
407+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
408+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
409+
;
310410
entry:
311411
br label %for.body
312412

@@ -351,6 +451,20 @@ define void @strong7(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
351451
; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
352452
; CHECK-NEXT: da analyze - none!
353453
;
454+
; CHECK-STRONG-SIV-LABEL: 'strong7'
455+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
456+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
457+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
458+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
459+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
460+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
461+
; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
462+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
463+
; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
464+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
465+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
466+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
467+
;
354468
entry:
355469
br label %for.body
356470

@@ -395,6 +509,20 @@ define void @strong8(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
395509
; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
396510
; CHECK-NEXT: da analyze - none!
397511
;
512+
; CHECK-STRONG-SIV-LABEL: 'strong8'
513+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
514+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
515+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
516+
; CHECK-STRONG-SIV-NEXT: da analyze - flow [*|<]!
517+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
518+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
519+
; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
520+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
521+
; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
522+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
523+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
524+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
525+
;
398526
entry:
399527
br label %for.body
400528

@@ -437,6 +565,20 @@ define void @strong9(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
437565
; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
438566
; CHECK-NEXT: da analyze - none!
439567
;
568+
; CHECK-STRONG-SIV-LABEL: 'strong9'
569+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
570+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
571+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
572+
; CHECK-STRONG-SIV-NEXT: da analyze - flow [*|<]!
573+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
574+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
575+
; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
576+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
577+
; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
578+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
579+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
580+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
581+
;
440582
entry:
441583
%cmp1 = icmp eq i64 %n, 0
442584
br i1 %cmp1, label %for.end, label %for.body.preheader
@@ -488,6 +630,20 @@ define void @strong10(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
488630
; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
489631
; CHECK-NEXT: da analyze - none!
490632
;
633+
; CHECK-STRONG-SIV-LABEL: 'strong10'
634+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
635+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
636+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4
637+
; CHECK-STRONG-SIV-NEXT: da analyze - consistent flow [0|<]!
638+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
639+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
640+
; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4
641+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
642+
; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
643+
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
644+
; CHECK-STRONG-SIV-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
645+
; CHECK-STRONG-SIV-NEXT: da analyze - none!
646+
;
491647
entry:
492648
br label %for.body
493649

@@ -512,3 +668,53 @@ for.body: ; preds = %entry, %for.body
512668
for.end: ; preds = %for.body
513669
ret void
514670
}
671+
672+
;; for (long unsigned i = 0; i < 9223372036854775806; i++) {
673+
;; for (long unsigned j = 0; j < 2147483640; j++) {
674+
;; A[i] = 0;
675+
;; A[j] = 0;
676+
;; }
677+
;; }
678+
679+
define dso_local void @strong11(ptr %A) local_unnamed_addr #0 {
680+
; CHECK-LABEL: 'strong11'
681+
; CHECK-NEXT: Src: store i32 0, ptr %arrayidx, align 4 --> Dst: store i32 0, ptr %arrayidx, align 4
682+
; CHECK-NEXT: da analyze - none!
683+
; CHECK-NEXT: Src: store i32 0, ptr %arrayidx, align 4 --> Dst: store i32 0, ptr %arrayidx4, align 4
684+
; CHECK-NEXT: da analyze - none!
685+
; CHECK-NEXT: Src: store i32 0, ptr %arrayidx4, align 4 --> Dst: store i32 0, ptr %arrayidx4, align 4
686+
; CHECK-NEXT: da analyze - consistent output [S 0]!
687+
;
688+
; CHECK-STRONG-SIV-LABEL: 'strong11'
689+
; CHECK-STRONG-SIV-NEXT: Src: store i32 0, ptr %arrayidx, align 4 --> Dst: store i32 0, ptr %arrayidx, align 4
690+
; CHECK-STRONG-SIV-NEXT: da analyze - consistent output [0 S]!
691+
; CHECK-STRONG-SIV-NEXT: Src: store i32 0, ptr %arrayidx, align 4 --> Dst: store i32 0, ptr %arrayidx4, align 4
692+
; CHECK-STRONG-SIV-NEXT: da analyze - consistent output [* *|<]!
693+
; CHECK-STRONG-SIV-NEXT: Src: store i32 0, ptr %arrayidx4, align 4 --> Dst: store i32 0, ptr %arrayidx4, align 4
694+
; CHECK-STRONG-SIV-NEXT: da analyze - consistent output [S 0]!
695+
;
696+
entry:
697+
br label %for.cond1.preheader
698+
699+
for.cond1.preheader: ; preds = %entry, %for.inc5
700+
%i.014 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ]
701+
%arrayidx = getelementptr inbounds nuw i32, ptr %A, i64 %i.014
702+
br label %for.body3
703+
704+
for.body3: ; preds = %for.cond1.preheader, %for.body3
705+
%j.013 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
706+
store i32 0, ptr %arrayidx, align 4
707+
%arrayidx4 = getelementptr inbounds nuw i32, ptr %A, i64 %j.013
708+
store i32 0, ptr %arrayidx4, align 4
709+
%inc = add nuw nsw i64 %j.013, 1
710+
%exitcond.not = icmp eq i64 %inc, 2147483640
711+
br i1 %exitcond.not, label %for.inc5, label %for.body3
712+
713+
for.inc5: ; preds = %for.body3
714+
%inc6 = add nuw nsw i64 %i.014, 1
715+
%exitcond15.not = icmp eq i64 %inc6, 9223372036854775806
716+
br i1 %exitcond15.not, label %for.end7, label %for.cond1.preheader
717+
718+
for.end7: ; preds = %for.inc5
719+
ret void
720+
}

0 commit comments

Comments
 (0)