From f95b589220c9b2d28598a1e47831e75e890b7c80 Mon Sep 17 00:00:00 2001 From: Hal Finkel Date: Wed, 28 Aug 2013 04:40:22 +0000 Subject: [PATCH] Disable loop vectorizer unrolling when no unrolling requested In addition to the regular loop unrolling transformation, the loop vectorizer can also unroll loops. If no unrolling has specifically been requested (by -fno-unroll-loops), and the loop vectorizer will be used, then add the backend option to (also) prevent the loop vectorizer from unrolling loops. I confirmed with Nadav (off list) that disabling vectorizer loop unrolling when -fno-unroll-loops is provided is the desired behavior. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@189440 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Driver/Tools.cpp | 12 +++++++++++- test/Driver/clang_f_opts.c | 3 +++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index c30c45d26b..89df632d5c 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -3382,9 +3382,19 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group : options::OPT_fvectorize; if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption, - options::OPT_fno_vectorize, EnableVec)) + options::OPT_fno_vectorize, EnableVec)) { CmdArgs.push_back("-vectorize-loops"); + // In addition to the regular loop unrolling transformation, the loop + // vectorizer can also unroll loops. If no unrolling has specifically been + // requested, then also prevent the loop vectorizer from unrolling loops. + if (Args.hasFlag(options::OPT_fno_unroll_loops, + options::OPT_funroll_loops, false)) { + CmdArgs.push_back("-backend-option"); + CmdArgs.push_back("-force-vector-unroll=1"); + } + } + // -fslp-vectorize is default. if (Args.hasFlag(options::OPT_fslp_vectorize, options::OPT_fno_slp_vectorize, true)) diff --git a/test/Driver/clang_f_opts.c b/test/Driver/clang_f_opts.c index 0cf4cc910b..5ab89d5c64 100644 --- a/test/Driver/clang_f_opts.c +++ b/test/Driver/clang_f_opts.c @@ -45,6 +45,7 @@ // CHECK-NO-UNROLL-LOOPS: "-fno-unroll-loops" // RUN: %clang -### -S -fvectorize %s 2>&1 | FileCheck -check-prefix=CHECK-VECTORIZE %s +// RUN: %clang -### -S -fvectorize -fno-unroll-loops %s 2>&1 | FileCheck -check-prefix=CHECK-VECTORIZE-NO-UNROLL %s // RUN: %clang -### -S -fno-vectorize -fvectorize %s 2>&1 | FileCheck -check-prefix=CHECK-VECTORIZE %s // RUN: %clang -### -S -fno-vectorize %s 2>&1 | FileCheck -check-prefix=CHECK-NO-VECTORIZE %s // RUN: %clang -### -S -fvectorize -fno-vectorize %s 2>&1 | FileCheck -check-prefix=CHECK-NO-VECTORIZE %s @@ -65,6 +66,8 @@ // RUN: %clang -### -S -Oz %s 2>&1 | FileCheck -check-prefix=CHECK-NO-VECTORIZE %s // CHECK-VECTORIZE: "-vectorize-loops" // CHECK-NO-VECTORIZE-NOT: "-vectorize-loops" +// CHECK-VECTORIZE-NOT: "-backend-option" "-force-vector-unroll=1" +// CHECK-VECTORIZE-NO-UNROLL: "-backend-option" "-force-vector-unroll=1" // RUN: %clang -### -S -fslp-vectorize %s 2>&1 | FileCheck -check-prefix=CHECK-SLP-VECTORIZE %s // RUN: %clang -### -S -fno-slp-vectorize -fslp-vectorize %s 2>&1 | FileCheck -check-prefix=CHECK-SLP-VECTORIZE %s -- 2.40.0