Home | History | Annotate | Download | only in X86
      1 ; RUN: opt -S -loop-vectorize -mtriple=x86_64-apple-darwin %s | FileCheck %s
      2 
      3 ; Two mostly identical functions. The only difference is the presence of
      4 ; fast-math flags on the second. The loop is a pretty simple reduction:
      5 
      6 ; for (int i = 0; i < 32; ++i)
      7 ;   if (arr[i] != 42)
      8 ;     tot += arr[i];
      9 
     10 define double @sumIfScalar(double* nocapture readonly %arr) {
     11 ; CHECK-LABEL: define double @sumIfScalar
     12 ; CHECK-NOT: <2 x double>
     13 
     14 entry:
     15   br label %loop
     16 
     17 loop:
     18   %i = phi i32 [0, %entry], [%i.next, %next.iter]
     19   %tot = phi double [0.0, %entry], [%tot.next, %next.iter]
     20 
     21   %addr = getelementptr double, double* %arr, i32 %i
     22   %nextval = load double, double* %addr
     23 
     24   %tst = fcmp une double %nextval, 42.0
     25   br i1 %tst, label %do.add, label %no.add
     26 
     27 do.add:
     28   %tot.new = fadd double %tot, %nextval
     29   br label %next.iter
     30 
     31 no.add:
     32   br label %next.iter
     33 
     34 next.iter:
     35   %tot.next = phi double [%tot, %no.add], [%tot.new, %do.add]
     36   %i.next = add i32 %i, 1
     37   %again = icmp ult i32 %i.next, 32
     38   br i1 %again, label %loop, label %done
     39 
     40 done:
     41   ret double %tot.next
     42 }
     43 
     44 define double @sumIfVector(double* nocapture readonly %arr) {
     45 ; CHECK-LABEL: define double @sumIfVector
     46 ; CHECK: <2 x double>
     47 entry:
     48   br label %loop
     49 
     50 loop:
     51   %i = phi i32 [0, %entry], [%i.next, %next.iter]
     52   %tot = phi double [0.0, %entry], [%tot.next, %next.iter]
     53 
     54   %addr = getelementptr double, double* %arr, i32 %i
     55   %nextval = load double, double* %addr
     56 
     57   %tst = fcmp fast une double %nextval, 42.0
     58   br i1 %tst, label %do.add, label %no.add
     59 
     60 do.add:
     61   %tot.new = fadd fast double %tot, %nextval
     62   br label %next.iter
     63 
     64 no.add:
     65   br label %next.iter
     66 
     67 next.iter:
     68   %tot.next = phi double [%tot, %no.add], [%tot.new, %do.add]
     69   %i.next = add i32 %i, 1
     70   %again = icmp ult i32 %i.next, 32
     71   br i1 %again, label %loop, label %done
     72 
     73 done:
     74   ret double %tot.next
     75 }
     76