mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
a420a14276
Summary: We need to add a runtime memcheck for pair of accesses (x,y) where at least one of x and y are writes. Assuming we have w writes and r reads, currently this number is estimated as being w* (w+r-1). This estimation will count (write,write) pairs twice and will overestimate the number of checks required. This change adds a getNumberOfChecks method to RuntimePointerCheck, which will count the number of runtime checks needed (similar in implementation to needsAnyChecking) and uses it to produce the correct number of runtime checks. Test Plan: llvm test suite spec2k spec2k6 Performance results: no changes observed (not surprising since the formula for 1 writer is basically the same, which would covers most cases - at least with the current check limit). Reviewers: anemet Reviewed By: anemet Subscribers: mzolotukhin, llvm-commits Differential Revision: http://reviews.llvm.org/D10217 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239295 91177308-0d34-0410-b5e6-96231b3b80d8
59 lines
1.7 KiB
LLVM
59 lines
1.7 KiB
LLVM
; RUN: opt -loop-accesses -analyze < %s | FileCheck %s
|
|
|
|
; 3 reads and 3 writes should need 12 memchecks
|
|
|
|
target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
|
|
target triple = "aarch64--linux-gnueabi"
|
|
|
|
; CHECK: Memory dependences are safe with run-time checks
|
|
; Memory dependecies have labels starting from 0, so in
|
|
; order to verify that we have n checks, we look for
|
|
; (n-1): and not n:.
|
|
|
|
; CHECK: Run-time memory checks:
|
|
; CHECK-NEXT: 0:
|
|
; CHECK: 11:
|
|
; CHECK-NOT: 12:
|
|
|
|
define void @testf(i16* %a,
|
|
i16* %b,
|
|
i16* %c,
|
|
i16* %d,
|
|
i16* %e,
|
|
i16* %f) {
|
|
entry:
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %for.body, %entry
|
|
%ind = phi i64 [ 0, %entry ], [ %add, %for.body ]
|
|
|
|
%add = add nuw nsw i64 %ind, 1
|
|
|
|
%arrayidxA = getelementptr inbounds i16, i16* %a, i64 %ind
|
|
%loadA = load i16, i16* %arrayidxA, align 2
|
|
|
|
%arrayidxB = getelementptr inbounds i16, i16* %b, i64 %ind
|
|
%loadB = load i16, i16* %arrayidxB, align 2
|
|
|
|
%arrayidxC = getelementptr inbounds i16, i16* %c, i64 %ind
|
|
%loadC = load i16, i16* %arrayidxC, align 2
|
|
|
|
%mul = mul i16 %loadB, %loadA
|
|
%mul1 = mul i16 %mul, %loadC
|
|
|
|
%arrayidxD = getelementptr inbounds i16, i16* %d, i64 %ind
|
|
store i16 %mul1, i16* %arrayidxD, align 2
|
|
|
|
%arrayidxE = getelementptr inbounds i16, i16* %e, i64 %ind
|
|
store i16 %mul, i16* %arrayidxE, align 2
|
|
|
|
%arrayidxF = getelementptr inbounds i16, i16* %f, i64 %ind
|
|
store i16 %mul1, i16* %arrayidxF, align 2
|
|
|
|
%exitcond = icmp eq i64 %add, 20
|
|
br i1 %exitcond, label %for.end, label %for.body
|
|
|
|
for.end: ; preds = %for.body
|
|
ret void
|
|
}
|