Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/Analysis/LoopAccessAnalysis/pointer-phis.ll
Show First 20 Lines • Show All 121 Lines • ▼ Show 20 Lines | |||||
exit: ; preds = %loop.latch | exit: ; preds = %loop.latch | ||||
ret i32 10 | ret i32 10 | ||||
} | } | ||||
define i32 @load_with_pointer_phi_outside_loop(double* %A, double* %B, double* %C, i1 %c.0, i1 %c.1) { | define i32 @load_with_pointer_phi_outside_loop(double* %A, double* %B, double* %C, i1 %c.0, i1 %c.1) { | ||||
; CHECK-LABEL: 'load_with_pointer_phi_outside_loop' | ; CHECK-LABEL: 'load_with_pointer_phi_outside_loop' | ||||
; CHECK-NEXT: loop.header: | ; CHECK-NEXT: loop.header: | ||||
; CHECK-NEXT: Report: unsafe dependent memory operations in loop | ; CHECK-NEXT: Report: unsafe dependent memory operations in loop | ||||
; CHECK-NEXT: Unknown data dependence. | |||||
; CHECK-NEXT: Dependences: | ; CHECK-NEXT: Dependences: | ||||
; CHECK-NEXT: Unknown: | ; CHECK-NEXT: Unknown: | ||||
; CHECK-NEXT: %v8 = load double, double* %ptr, align 8 -> | ; CHECK-NEXT: %v8 = load double, double* %ptr, align 8 -> | ||||
; CHECK-NEXT: store double %mul16, double* %arrayidx, align 8 | ; CHECK-NEXT: store double %mul16, double* %arrayidx, align 8 | ||||
; | ; | ||||
entry: | entry: | ||||
br i1 %c.0, label %if.then, label %if.else | br i1 %c.0, label %if.then, label %if.else | ||||
Show All 21 Lines | |||||
exit: ; preds = %loop.latch | exit: ; preds = %loop.latch | ||||
ret i32 10 | ret i32 10 | ||||
} | } | ||||
define i32 @store_with_pointer_phi_outside_loop(double* %A, double* %B, double* %C, i1 %c.0, i1 %c.1) { | define i32 @store_with_pointer_phi_outside_loop(double* %A, double* %B, double* %C, i1 %c.0, i1 %c.1) { | ||||
; CHECK-LABEL: 'store_with_pointer_phi_outside_loop' | ; CHECK-LABEL: 'store_with_pointer_phi_outside_loop' | ||||
; CHECK-NEXT: loop.header: | ; CHECK-NEXT: loop.header: | ||||
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. | ; CHECK-NEXT: Report: unsafe dependent memory operations in loop. | ||||
; CHECK-NEXT: Unknown data dependence. | |||||
; CHECK-NEXT: Dependences: | ; CHECK-NEXT: Dependences: | ||||
; CHECK-NEXT: Unknown: | ; CHECK-NEXT: Unknown: | ||||
; CHECK-NEXT: %v8 = load double, double* %arrayidx, align 8 -> | ; CHECK-NEXT: %v8 = load double, double* %arrayidx, align 8 -> | ||||
; CHECK-NEXT: store double %mul16, double* %ptr, align 8 | ; CHECK-NEXT: store double %mul16, double* %ptr, align 8 | ||||
; | ; | ||||
entry: | entry: | ||||
br i1 %c.0, label %if.then, label %if.else | br i1 %c.0, label %if.then, label %if.else | ||||
Show All 21 Lines | |||||
exit: ; preds = %loop.latch | exit: ; preds = %loop.latch | ||||
ret i32 10 | ret i32 10 | ||||
} | } | ||||
define i32 @store_with_pointer_phi_incoming_phi(double* %A, double* %B, double* %C, i1 %c.0, i1 %c.1) { | define i32 @store_with_pointer_phi_incoming_phi(double* %A, double* %B, double* %C, i1 %c.0, i1 %c.1) { | ||||
; CHECK-LABEL: 'store_with_pointer_phi_incoming_phi' | ; CHECK-LABEL: 'store_with_pointer_phi_incoming_phi' | ||||
; CHECK-NEXT: loop.header: | ; CHECK-NEXT: loop.header: | ||||
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop | ; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop | ||||
; CHECK-NEXT: Unknown data dependence. | |||||
; CHECK-NEXT: Dependences: | ; CHECK-NEXT: Dependences: | ||||
; CHECK-NEXT: Unknown: | ; CHECK-NEXT: Unknown: | ||||
; CHECK-NEXT: %v8 = load double, double* %arrayidx, align 8 -> | ; CHECK-NEXT: %v8 = load double, double* %arrayidx, align 8 -> | ||||
; CHECK-NEXT: store double %mul16, double* %ptr.2, align 8 | ; CHECK-NEXT: store double %mul16, double* %ptr.2, align 8 | ||||
; CHECK-EMPTY: | ; CHECK-EMPTY: | ||||
; CHECK-NEXT: Run-time memory checks: | ; CHECK-NEXT: Run-time memory checks: | ||||
; CHECK-NEXT: Check 0: | ; CHECK-NEXT: Check 0: | ||||
; CHECK-NEXT: Comparing group ([[GROUP_C:.+]]): | ; CHECK-NEXT: Comparing group ([[GROUP_C:.+]]): | ||||
▲ Show 20 Lines • Show All 60 Lines • ▼ Show 20 Lines | exit: ; preds = %loop.latch | ||||
ret i32 10 | ret i32 10 | ||||
} | } | ||||
; Test cases with pointer phis forming a cycle. | ; Test cases with pointer phis forming a cycle. | ||||
define i32 @store_with_pointer_phi_incoming_phi_irreducible_cycle(double* %A, double* %B, double* %C, i1 %c.0, i1 %c.1) { | define i32 @store_with_pointer_phi_incoming_phi_irreducible_cycle(double* %A, double* %B, double* %C, i1 %c.0, i1 %c.1) { | ||||
; CHECK-LABEL: 'store_with_pointer_phi_incoming_phi_irreducible_cycle' | ; CHECK-LABEL: 'store_with_pointer_phi_incoming_phi_irreducible_cycle' | ||||
; CHECK-NEXT: loop.header: | ; CHECK-NEXT: loop.header: | ||||
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop | ; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop | ||||
; CHECK-NEXT: Unknown data dependence. | |||||
; CHECK-NEXT: Dependences: | ; CHECK-NEXT: Dependences: | ||||
; CHECK-NEXT: Unknown: | ; CHECK-NEXT: Unknown: | ||||
; CHECK-NEXT: %v8 = load double, double* %arrayidx, align 8 -> | ; CHECK-NEXT: %v8 = load double, double* %arrayidx, align 8 -> | ||||
; CHECK-NEXT: store double %mul16, double* %ptr.3, align 8 | ; CHECK-NEXT: store double %mul16, double* %ptr.3, align 8 | ||||
; CHECK-EMPTY: | ; CHECK-EMPTY: | ||||
; CHECK-NEXT: Run-time memory checks: | ; CHECK-NEXT: Run-time memory checks: | ||||
; CHECK-NEXT: Check 0: | ; CHECK-NEXT: Check 0: | ||||
; CHECK-NEXT: Comparing group ([[GROUP_C:.+]]): | ; CHECK-NEXT: Comparing group ([[GROUP_C:.+]]): | ||||
▲ Show 20 Lines • Show All 55 Lines • ▼ Show 20 Lines | |||||
exit: ; preds = %loop.latch | exit: ; preds = %loop.latch | ||||
ret i32 10 | ret i32 10 | ||||
} | } | ||||
define i32 @store_with_pointer_phi_outside_loop_select(double* %A, double* %B, double* %C, i1 %c.0, i1 %c.1) { | define i32 @store_with_pointer_phi_outside_loop_select(double* %A, double* %B, double* %C, i1 %c.0, i1 %c.1) { | ||||
; CHECK-LABEL: 'store_with_pointer_phi_outside_loop_select' | ; CHECK-LABEL: 'store_with_pointer_phi_outside_loop_select' | ||||
; CHECK-NEXT: loop.header: | ; CHECK-NEXT: loop.header: | ||||
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. | ; CHECK-NEXT: Report: unsafe dependent memory operations in loop. | ||||
; CHECK-NEXT: Unknown data dependence. | |||||
; CHECK-NEXT: Dependences: | ; CHECK-NEXT: Dependences: | ||||
; CHECK-NEXT: Unknown: | ; CHECK-NEXT: Unknown: | ||||
; CHECK-NEXT: %v8 = load double, double* %arrayidx, align 8 -> | ; CHECK-NEXT: %v8 = load double, double* %arrayidx, align 8 -> | ||||
; CHECK-NEXT: store double %mul16, double* %ptr, align 8 | ; CHECK-NEXT: store double %mul16, double* %ptr, align 8 | ||||
; | ; | ||||
entry: | entry: | ||||
br i1 %c.0, label %if.then, label %if.else | br i1 %c.0, label %if.then, label %if.else | ||||
▲ Show 20 Lines • Show All 49 Lines • ▼ Show 20 Lines | |||||
exit: ; preds = %loop.latch | exit: ; preds = %loop.latch | ||||
ret i32 10 | ret i32 10 | ||||
} | } | ||||
define void @phi_load_store_memdep_check(i1 %c, i16* %A, i16* %B, i16* %C) { | define void @phi_load_store_memdep_check(i1 %c, i16* %A, i16* %B, i16* %C) { | ||||
; CHECK-LABEL: Loop access info in function 'phi_load_store_memdep_check': | ; CHECK-LABEL: Loop access info in function 'phi_load_store_memdep_check': | ||||
; CHECK-NEXT: for.body: | ; CHECK-NEXT: for.body: | ||||
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop | ; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop | ||||
; CHECK-NEXT: Unknown data dependence. | |||||
; CHECK-NEXT: Dependences: | ; CHECK-NEXT: Dependences: | ||||
; CHECK-NEXT: Unknown: | ; CHECK-NEXT: Unknown: | ||||
; CHECK-NEXT: %lv3 = load i16, i16* %c.sink, align 2 -> | ; CHECK-NEXT: %lv3 = load i16, i16* %c.sink, align 2 -> | ||||
; CHECK-NEXT: store i16 %add, i16* %c.sink, align 1 | ; CHECK-NEXT: store i16 %add, i16* %c.sink, align 1 | ||||
; CHECK-EMPTY: | ; CHECK-EMPTY: | ||||
; CHECK-NEXT: Unknown: | ; CHECK-NEXT: Unknown: | ||||
; CHECK-NEXT: %lv3 = load i16, i16* %c.sink, align 2 -> | ; CHECK-NEXT: %lv3 = load i16, i16* %c.sink, align 2 -> | ||||
; CHECK-NEXT: store i16 %add, i16* %c.sink, align 1 | ; CHECK-NEXT: store i16 %add, i16* %c.sink, align 1 | ||||
▲ Show 20 Lines • Show All 71 Lines • Show Last 20 Lines |