mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
5173fc6da9
This case is slightly tricky, because loop distribution should be allowed in some cases, and not others. As long as runtime dependency checks don't need to be introduced, this should be OK. This is further complicated by the fact that LoopDistribute partially ignores if LAA says that vectorization is safe, and then does its own runtime pointer legality checks. Note this pass still does not handle noduplicate correctly, as this should always be forbidden with it. I'm not going to bother trying to fix it, as it would require more effort and I think noduplicate should be removed. https://reviews.llvm.org/D62607 llvm-svn: 363160
74 lines
2.6 KiB
LLVM
74 lines
2.6 KiB
LLVM
; RUN: opt -loop-accesses -analyze < %s | FileCheck %s
|
|
; RUN: opt -passes='require<scalar-evolution>,require<aa>,loop(print-access-info)' -disable-output < %s 2>&1 | FileCheck %s
|
|
|
|
; Analyze this loop:
|
|
; for (i = 0; i < n; i++)
|
|
; A[i + 1] = A[i] * B[i] * C[i];
|
|
|
|
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
|
|
|
; CHECK: for.body:
|
|
; CHECK: Has convergent operation in loop
|
|
; CHECK: Report: cannot add control dependency to convergent operation
|
|
; CHECK-NEXT: Dependences:
|
|
; CHECK-NEXT: Backward:
|
|
; CHECK-NEXT: %loadA = load i16, i16* %arrayidxA, align 2 ->
|
|
; CHECK-NEXT: store i16 %mul1, i16* %arrayidxA_plus_2, align 2
|
|
; CHECK: Run-time memory checks:
|
|
; CHECK-NEXT: 0:
|
|
; CHECK-NEXT: Comparing group
|
|
; CHECK-NEXT: %arrayidxA = getelementptr inbounds i16, i16* %a, i64 %storemerge3
|
|
; CHECK-NEXT: %arrayidxA_plus_2 = getelementptr inbounds i16, i16* %a, i64 %add
|
|
; CHECK-NEXT: Against group
|
|
; CHECK-NEXT: %arrayidxB = getelementptr inbounds i16, i16* %b, i64 %storemerge3
|
|
; CHECK-NEXT: 1:
|
|
; CHECK-NEXT: Comparing group
|
|
; CHECK-NEXT: %arrayidxA = getelementptr inbounds i16, i16* %a, i64 %storemerge3
|
|
; CHECK-NEXT: %arrayidxA_plus_2 = getelementptr inbounds i16, i16* %a, i64 %add
|
|
; CHECK-NEXT: Against group
|
|
; CHECK-NEXT: %arrayidxC = getelementptr inbounds i16, i16* %c, i64 %storemerge3
|
|
|
|
@B = common global i16* null, align 8
|
|
@A = common global i16* null, align 8
|
|
@C = common global i16* null, align 8
|
|
|
|
define void @f() #1 {
|
|
entry:
|
|
%a = load i16*, i16** @A, align 8
|
|
%b = load i16*, i16** @B, align 8
|
|
%c = load i16*, i16** @C, align 8
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %for.body, %entry
|
|
%storemerge3 = phi i64 [ 0, %entry ], [ %add, %for.body ]
|
|
|
|
%arrayidxA = getelementptr inbounds i16, i16* %a, i64 %storemerge3
|
|
%loadA = load i16, i16* %arrayidxA, align 2
|
|
|
|
%arrayidxB = getelementptr inbounds i16, i16* %b, i64 %storemerge3
|
|
%loadB = load i16, i16* %arrayidxB, align 2
|
|
|
|
%arrayidxC = getelementptr inbounds i16, i16* %c, i64 %storemerge3
|
|
%loadC = load i16, i16* %arrayidxC, align 2
|
|
|
|
call void @llvm.convergent()
|
|
|
|
%mul = mul i16 %loadB, %loadA
|
|
%mul1 = mul i16 %mul, %loadC
|
|
|
|
%add = add nuw nsw i64 %storemerge3, 1
|
|
%arrayidxA_plus_2 = getelementptr inbounds i16, i16* %a, i64 %add
|
|
store i16 %mul1, i16* %arrayidxA_plus_2, align 2
|
|
|
|
%exitcond = icmp eq i64 %add, 20
|
|
br i1 %exitcond, label %for.end, label %for.body
|
|
|
|
for.end: ; preds = %for.body
|
|
ret void
|
|
}
|
|
|
|
declare void @llvm.convergent() #0
|
|
|
|
attributes #0 = { nounwind readnone convergent }
|
|
attributes #1 = { nounwind convergent }
|