diff options
Diffstat (limited to 'llvm/test/Transforms')
| -rw-r--r-- | llvm/test/Transforms/LoopVectorize/imprecise-through-phis.ll | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/llvm/test/Transforms/LoopVectorize/imprecise-through-phis.ll b/llvm/test/Transforms/LoopVectorize/imprecise-through-phis.ll new file mode 100644 index 00000000000..ee0a245c5e0 --- /dev/null +++ b/llvm/test/Transforms/LoopVectorize/imprecise-through-phis.ll @@ -0,0 +1,75 @@ +; 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 +} |

