| ; RUN: opt -S -loop-vectorize -mtriple=x86_64-apple-darwin %s | FileCheck %s |
| |
| ; Two mostly identical functions. The only difference is the presence of |
| ; fast-math flags on the second. The loop is a pretty simple reduction: |
| |
| ; for (int i = 0; i < 32; ++i) |
| ; if (arr[i] != 42) |
| ; tot += arr[i]; |
| |
| define double @sumIfScalar(double* nocapture readonly %arr) { |
| ; CHECK-LABEL: define double @sumIfScalar |
| ; CHECK-NOT: <2 x double> |
| |
| entry: |
| br label %loop |
| |
| loop: |
| %i = phi i32 [0, %entry], [%i.next, %next.iter] |
| %tot = phi double [0.0, %entry], [%tot.next, %next.iter] |
| |
| %addr = getelementptr double, double* %arr, i32 %i |
| %nextval = load double, double* %addr |
| |
| %tst = fcmp une double %nextval, 42.0 |
| br i1 %tst, label %do.add, label %no.add |
| |
| do.add: |
| %tot.new = fadd double %tot, %nextval |
| br label %next.iter |
| |
| no.add: |
| br label %next.iter |
| |
| next.iter: |
| %tot.next = phi double [%tot, %no.add], [%tot.new, %do.add] |
| %i.next = add i32 %i, 1 |
| %again = icmp ult i32 %i.next, 32 |
| br i1 %again, label %loop, label %done |
| |
| done: |
| ret double %tot.next |
| } |
| |
| define double @sumIfVector(double* nocapture readonly %arr) { |
| ; CHECK-LABEL: define double @sumIfVector |
| ; CHECK: <2 x double> |
| entry: |
| br label %loop |
| |
| loop: |
| %i = phi i32 [0, %entry], [%i.next, %next.iter] |
| %tot = phi double [0.0, %entry], [%tot.next, %next.iter] |
| |
| %addr = getelementptr double, double* %arr, i32 %i |
| %nextval = load double, double* %addr |
| |
| %tst = fcmp fast une double %nextval, 42.0 |
| br i1 %tst, label %do.add, label %no.add |
| |
| do.add: |
| %tot.new = fadd fast double %tot, %nextval |
| br label %next.iter |
| |
| no.add: |
| br label %next.iter |
| |
| next.iter: |
| %tot.next = phi double [%tot, %no.add], [%tot.new, %do.add] |
| %i.next = add i32 %i, 1 |
| %again = icmp ult i32 %i.next, 32 |
| br i1 %again, label %loop, label %done |
| |
| done: |
| ret double %tot.next |
| } |