Home | History | Annotate | Download | only in LoopVersioning
      1 ; RUN: opt -basicaa -loop-versioning -S < %s | FileCheck %s
      2 
      3 target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
      4 
      5 ; Version this loop with overlap checks between a, c and b, c.
      6 
      7 define void @f(i32* %a, i32* %b, i32* %c) {
      8 entry:
      9   br label %for.body
     10 
     11 ; CHECK: for.body.lver.check:
     12 ; CHECK:   icmp
     13 ; CHECK:   icmp
     14 ; CHECK:   icmp
     15 ; CHECK:   icmp
     16 ; CHECK-NOT: icmp
     17 ; CHECK:   br i1 %memcheck.conflict, label %for.body.ph.lver.orig, label %for.body.ph
     18 
     19 ; CHECK: for.body.ph.lver.orig:
     20 ; CHECK: for.body.lver.orig:
     21 ; CHECK:   br i1 %exitcond.lver.orig, label %for.end, label %for.body.lver.orig
     22 ; CHECK: for.body.ph:
     23 ; CHECK: for.body:
     24 ; CHECK:   br i1 %exitcond, label %for.end, label %for.body
     25 ; CHECK: for.end:
     26 
     27 for.body:                                         ; preds = %for.body, %entry
     28   %ind = phi i64 [ 0, %entry ], [ %add, %for.body ]
     29 
     30   %arrayidxA = getelementptr inbounds i32, i32* %a, i64 %ind
     31   %loadA = load i32, i32* %arrayidxA, align 4
     32 
     33   %arrayidxB = getelementptr inbounds i32, i32* %b, i64 %ind
     34   %loadB = load i32, i32* %arrayidxB, align 4
     35 
     36   %mulC = mul i32 %loadA, %loadB
     37 
     38   %arrayidxC = getelementptr inbounds i32, i32* %c, i64 %ind
     39   store i32 %mulC, i32* %arrayidxC, align 4
     40 
     41   %add = add nuw nsw i64 %ind, 1
     42   %exitcond = icmp eq i64 %add, 20
     43   br i1 %exitcond, label %for.end, label %for.body
     44 
     45 for.end:                                          ; preds = %for.body
     46   ret void
     47 }
     48