Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/Analysis/LoopAccessAnalysis/stride-access-dependence.ll
Show First 20 Lines • Show All 112 Lines • ▼ Show 20 Lines | |||||
; void unsafe_Read_Write(int *A) { | ; void unsafe_Read_Write(int *A) { | ||||
; for (unsigned i = 0; i < 1024; i+=3) | ; for (unsigned i = 0; i < 1024; i+=3) | ||||
; A[i+3] = A[i] + 1; | ; A[i+3] = A[i] + 1; | ||||
; } | ; } | ||||
; CHECK: function 'unsafe_Read_Write': | ; CHECK: function 'unsafe_Read_Write': | ||||
; CHECK-NEXT: for.body: | ; CHECK-NEXT: for.body: | ||||
; CHECK-NEXT: Report: unsafe dependent memory operations in loop | ; CHECK-NEXT: Report: unsafe dependent memory operations in loop | ||||
; CHECK-NEXT: Backward loop carried data dependence. | |||||
sdesmalen: Please CHECK-NEXT for the full line that is printed. | |||||
Agreed. But now the code will only print the remaining text: "Memory location is the same as ...etc" so this is no longer an issue (since this test does not contain any debug info/metadata). malharJ: Agreed.
But now the code will only print the remaining text: "Memory location is the same as .. | |||||
; CHECK-NEXT: Dependences: | ; CHECK-NEXT: Dependences: | ||||
; CHECK-NEXT: Backward: | ; CHECK-NEXT: Backward: | ||||
; CHECK-NEXT: %0 = load i32, i32* %arrayidx, align 4 -> | ; CHECK-NEXT: %0 = load i32, i32* %arrayidx, align 4 -> | ||||
; CHECK-NEXT: store i32 %add, i32* %arrayidx3, align 4 | ; CHECK-NEXT: store i32 %add, i32* %arrayidx3, align 4 | ||||
define void @unsafe_Read_Write(i32* nocapture %A) { | define void @unsafe_Read_Write(i32* nocapture %A) { | ||||
entry: | entry: | ||||
br label %for.body | br label %for.body | ||||
Show All 23 Lines | |||||
; } | ; } | ||||
; | ; | ||||
; return sum; | ; return sum; | ||||
; } | ; } | ||||
; CHECK: function 'unsafe_Write_Read': | ; CHECK: function 'unsafe_Write_Read': | ||||
; CHECK-NEXT: for.body: | ; CHECK-NEXT: for.body: | ||||
; CHECK-NEXT: Report: unsafe dependent memory operations in loop | ; CHECK-NEXT: Report: unsafe dependent memory operations in loop | ||||
; CHECK-NEXT: Backward loop carried data dependence. | |||||
; CHECK-NEXT: Dependences: | ; CHECK-NEXT: Dependences: | ||||
; CHECK-NEXT: Backward: | ; CHECK-NEXT: Backward: | ||||
; CHECK-NEXT: store i32 %0, i32* %arrayidx, align 4 -> | ; CHECK-NEXT: store i32 %0, i32* %arrayidx, align 4 -> | ||||
; CHECK-NEXT: %1 = load i32, i32* %arrayidx2, align 4 | ; CHECK-NEXT: %1 = load i32, i32* %arrayidx2, align 4 | ||||
define i32 @unsafe_Write_Read(i32* nocapture %A) { | define i32 @unsafe_Write_Read(i32* nocapture %A) { | ||||
entry: | entry: | ||||
br label %for.body | br label %for.body | ||||
Show All 20 Lines | |||||
; A[i] = i; | ; A[i] = i; | ||||
; A[i+2] = i+1; | ; A[i+2] = i+1; | ||||
; } | ; } | ||||
; } | ; } | ||||
; CHECK: function 'unsafe_Write_Write': | ; CHECK: function 'unsafe_Write_Write': | ||||
; CHECK-NEXT: for.body: | ; CHECK-NEXT: for.body: | ||||
; CHECK-NEXT: Report: unsafe dependent memory operations in loop | ; CHECK-NEXT: Report: unsafe dependent memory operations in loop | ||||
; CHECK-NEXT: Backward loop carried data dependence. | |||||
; CHECK-NEXT: Dependences: | ; CHECK-NEXT: Dependences: | ||||
; CHECK-NEXT: Backward: | ; CHECK-NEXT: Backward: | ||||
; CHECK-NEXT: store i32 %0, i32* %arrayidx, align 4 -> | ; CHECK-NEXT: store i32 %0, i32* %arrayidx, align 4 -> | ||||
; CHECK-NEXT: store i32 %2, i32* %arrayidx3, align 4 | ; CHECK-NEXT: store i32 %2, i32* %arrayidx3, align 4 | ||||
define void @unsafe_Write_Write(i32* nocapture %A) { | define void @unsafe_Write_Write(i32* nocapture %A) { | ||||
entry: | entry: | ||||
br label %for.body | br label %for.body | ||||
▲ Show 20 Lines • Show All 137 Lines • ▼ Show 20 Lines | |||||
; } | ; } | ||||
; FIXME: This case looks like previous case @vectorizable_Read_Write. It sould | ; FIXME: This case looks like previous case @vectorizable_Read_Write. It sould | ||||
; be vectorizable. | ; be vectorizable. | ||||
; CHECK: function 'vectorizable_unscaled_Read_Write': | ; CHECK: function 'vectorizable_unscaled_Read_Write': | ||||
; CHECK-NEXT: for.body: | ; CHECK-NEXT: for.body: | ||||
; CHECK-NEXT: Report: unsafe dependent memory operations in loop | ; CHECK-NEXT: Report: unsafe dependent memory operations in loop | ||||
; CHECK-NEXT: Backward loop carried data dependence that prevents store-to-load forwarding. | |||||
; CHECK-NEXT: Dependences: | ; CHECK-NEXT: Dependences: | ||||
; CHECK-NEXT: BackwardVectorizableButPreventsForwarding: | ; CHECK-NEXT: BackwardVectorizableButPreventsForwarding: | ||||
; CHECK-NEXT: %2 = load i32, i32* %arrayidx, align 4 -> | ; CHECK-NEXT: %2 = load i32, i32* %arrayidx, align 4 -> | ||||
; CHECK-NEXT: store i32 %add, i32* %arrayidx2, align 4 | ; CHECK-NEXT: store i32 %add, i32* %arrayidx2, align 4 | ||||
define void @vectorizable_unscaled_Read_Write(i32* nocapture %A) { | define void @vectorizable_unscaled_Read_Write(i32* nocapture %A) { | ||||
entry: | entry: | ||||
%0 = bitcast i32* %A to i8* | %0 = bitcast i32* %A to i8* | ||||
▲ Show 20 Lines • Show All 63 Lines • ▼ Show 20 Lines | |||||
; int *B = (int *)((char *)A + 11); | ; int *B = (int *)((char *)A + 11); | ||||
; for (unsigned i = 0; i < 1024; i+=2) | ; for (unsigned i = 0; i < 1024; i+=2) | ||||
; B[i] = A[i] + 1; | ; B[i] = A[i] + 1; | ||||
; } | ; } | ||||
; CHECK: function 'unsafe_unscaled_Read_Write': | ; CHECK: function 'unsafe_unscaled_Read_Write': | ||||
; CHECK-NEXT: for.body: | ; CHECK-NEXT: for.body: | ||||
; CHECK-NEXT: Report: unsafe dependent memory operations in loop | ; CHECK-NEXT: Report: unsafe dependent memory operations in loop | ||||
; CHECK-NEXT: Backward loop carried data dependence. | |||||
; CHECK-NEXT: Dependences: | ; CHECK-NEXT: Dependences: | ||||
; CHECK-NEXT: Backward: | ; CHECK-NEXT: Backward: | ||||
; CHECK-NEXT: %2 = load i32, i32* %arrayidx, align 4 -> | ; CHECK-NEXT: %2 = load i32, i32* %arrayidx, align 4 -> | ||||
; CHECK-NEXT: store i32 %add, i32* %arrayidx2, align 4 | ; CHECK-NEXT: store i32 %add, i32* %arrayidx2, align 4 | ||||
define void @unsafe_unscaled_Read_Write(i32* nocapture %A) { | define void @unsafe_unscaled_Read_Write(i32* nocapture %A) { | ||||
entry: | entry: | ||||
%0 = bitcast i32* %A to i8* | %0 = bitcast i32* %A to i8* | ||||
Show All 14 Lines | for.body: ; preds = %entry, %for.body | ||||
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 2 | %indvars.iv.next = add nuw nsw i64 %indvars.iv, 2 | ||||
%cmp = icmp ult i64 %indvars.iv.next, 1024 | %cmp = icmp ult i64 %indvars.iv.next, 1024 | ||||
br i1 %cmp, label %for.body, label %for.cond.cleanup | br i1 %cmp, label %for.body, label %for.cond.cleanup | ||||
} | } | ||||
; CHECK: function 'unsafe_unscaled_Read_Write2': | ; CHECK: function 'unsafe_unscaled_Read_Write2': | ||||
; CHECK-NEXT: for.body: | ; CHECK-NEXT: for.body: | ||||
; CHECK-NEXT: Report: unsafe dependent memory operations in loop | ; CHECK-NEXT: Report: unsafe dependent memory operations in loop | ||||
; CHECK-NEXT: Backward loop carried data dependence. | |||||
; CHECK-NEXT: Dependences: | ; CHECK-NEXT: Dependences: | ||||
; CHECK-NEXT: Backward: | ; CHECK-NEXT: Backward: | ||||
; CHECK-NEXT: %2 = load i32, i32* %arrayidx, align 4 -> | ; CHECK-NEXT: %2 = load i32, i32* %arrayidx, align 4 -> | ||||
; CHECK-NEXT: store i32 %add, i32* %arrayidx2, align 4 | ; CHECK-NEXT: store i32 %add, i32* %arrayidx2, align 4 | ||||
; void unsafe_unscaled_Read_Write2(int *A) { | ; void unsafe_unscaled_Read_Write2(int *A) { | ||||
; int *B = (int *)((char *)A + 1); | ; int *B = (int *)((char *)A + 1); | ||||
; for (unsigned i = 0; i < 1024; i+=2) | ; for (unsigned i = 0; i < 1024; i+=2) | ||||
Show All 34 Lines | |||||
; } | ; } | ||||
; } | ; } | ||||
; | ; | ||||
; The access (2) has overlaps with (1) and (3). | ; The access (2) has overlaps with (1) and (3). | ||||
; CHECK: function 'interleaved_stores': | ; CHECK: function 'interleaved_stores': | ||||
; CHECK-NEXT: for.body: | ; CHECK-NEXT: for.body: | ||||
; CHECK-NEXT: Report: unsafe dependent memory operations in loop | ; CHECK-NEXT: Report: unsafe dependent memory operations in loop | ||||
; CHECK-NEXT: Backward loop carried data dependence. | |||||
; CHECK-NEXT: Dependences: | ; CHECK-NEXT: Dependences: | ||||
; CHECK-NEXT: Backward: | ; CHECK-NEXT: Backward: | ||||
; CHECK-NEXT: store i32 %4, i32* %arrayidx5, align 4 -> | ; CHECK-NEXT: store i32 %4, i32* %arrayidx5, align 4 -> | ||||
; CHECK-NEXT: store i32 %4, i32* %arrayidx9, align 4 | ; CHECK-NEXT: store i32 %4, i32* %arrayidx9, align 4 | ||||
; CHECK: Backward: | ; CHECK: Backward: | ||||
; CHECK-NEXT: store i32 %2, i32* %arrayidx2, align 4 -> | ; CHECK-NEXT: store i32 %2, i32* %arrayidx2, align 4 -> | ||||
; CHECK-NEXT: store i32 %4, i32* %arrayidx5, align 4 | ; CHECK-NEXT: store i32 %4, i32* %arrayidx5, align 4 | ||||
Show All 25 Lines |
Please CHECK-NEXT for the full line that is printed.