@@ -349,3 +349,90 @@ loop:
349349exit:
350350 ret void
351351}
352+
353+ ; TODO Should be able to determine no-dep, same as @nodep_via_logical_and_2.
354+ define void @nodep_via_logical_and_1 (ptr %A , i32 %index , i32 %n ) {
355+ ; CHECK-LABEL: 'nodep_via_logical_and_1'
356+ ; CHECK-NEXT: loop:
357+ ; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
358+ ; CHECK-NEXT: Unknown data dependence.
359+ ; CHECK-NEXT: Dependences:
360+ ; CHECK-NEXT: Unknown:
361+ ; CHECK-NEXT: %0 = load double, ptr %gep.load, align 8 ->
362+ ; CHECK-NEXT: store double %0, ptr %gep.store, align 8
363+ ; CHECK-EMPTY:
364+ ; CHECK-NEXT: Run-time memory checks:
365+ ; CHECK-NEXT: Grouped accesses:
366+ ; CHECK-EMPTY:
367+ ; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
368+ ; CHECK-NEXT: SCEV assumptions:
369+ ; CHECK-EMPTY:
370+ ; CHECK-NEXT: Expressions re-written:
371+ ;
372+ entry:
373+ %pre.0 = icmp sgt i32 %index , 0
374+ %pre.1 = icmp slt i32 %index , %n
375+ %and.pre = select i1 %pre.1 , i1 %pre.0 , i1 false
376+ br i1 %and.pre , label %ph , label %exit
377+
378+ ph:
379+ %idx.1 = add i32 %index , 1
380+ %start = zext i32 %idx.1 to i64
381+ br label %loop
382+
383+ loop:
384+ %iv = phi i64 [ %start , %ph ], [ %iv.next , %loop ]
385+ %gep.load = getelementptr double , ptr %A , i64 %iv
386+ %1 = load double , ptr %gep.load , align 8
387+ %index.ext = zext i32 %index to i64
388+ %gep.store = getelementptr double , ptr %A , i64 %index.ext
389+ store double %1 , ptr %gep.store , align 8
390+ %iv.next = add i64 %iv , 1
391+ %t = trunc i64 %iv to i32
392+ %ec = icmp slt i32 %t , 1
393+ br i1 %ec , label %loop , label %exit
394+
395+ exit:
396+ ret void
397+ }
398+
399+ ; Same as nodep_via_logical_and_1 but with different operand order of the logical and.
400+ define void @nodep_via_logical_and_2 (ptr %A , i32 %index , i32 %n ) {
401+ ; CHECK-LABEL: 'nodep_via_logical_and_2'
402+ ; CHECK-NEXT: loop:
403+ ; CHECK-NEXT: Memory dependences are safe
404+ ; CHECK-NEXT: Dependences:
405+ ; CHECK-NEXT: Run-time memory checks:
406+ ; CHECK-NEXT: Grouped accesses:
407+ ; CHECK-EMPTY:
408+ ; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
409+ ; CHECK-NEXT: SCEV assumptions:
410+ ; CHECK-EMPTY:
411+ ; CHECK-NEXT: Expressions re-written:
412+ ;
413+ entry:
414+ %pre.0 = icmp sgt i32 %index , 0
415+ %pre.1 = icmp slt i32 %index , %n
416+ %and.pre = select i1 %pre.0 , i1 %pre.1 , i1 false
417+ br i1 %and.pre , label %ph , label %exit
418+
419+ ph:
420+ %idx.1 = add i32 %index , 1
421+ %start = zext i32 %idx.1 to i64
422+ br label %loop
423+
424+ loop:
425+ %iv = phi i64 [ %start , %ph ], [ %iv.next , %loop ]
426+ %gep.load = getelementptr double , ptr %A , i64 %iv
427+ %1 = load double , ptr %gep.load , align 8
428+ %index.ext = zext i32 %index to i64
429+ %gep.store = getelementptr double , ptr %A , i64 %index.ext
430+ store double %1 , ptr %gep.store , align 8
431+ %iv.next = add i64 %iv , 1
432+ %t = trunc i64 %iv to i32
433+ %ec = icmp slt i32 %t , 1
434+ br i1 %ec , label %loop , label %exit
435+
436+ exit:
437+ ret void
438+ }
0 commit comments