From 67a6ec87be54f84e8c8ea6c49583e9303fecef2c Mon Sep 17 00:00:00 2001 From: Nadav Rotem Date: Wed, 19 Dec 2012 08:28:24 +0000 Subject: [PATCH] DOC: add a benchmarks that compares us to gcc and icc. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@170509 91177308-0d34-0410-b5e6-96231b3b80d8 --- docs/Vectorizers.rst | 13 +++++++++++++ docs/gcc-loops.png | Bin 0 -> 16653 bytes 2 files changed, 13 insertions(+) create mode 100644 docs/gcc-loops.png diff --git a/docs/Vectorizers.rst b/docs/Vectorizers.rst index 291c76dd265..b60e46dbca0 100644 --- a/docs/Vectorizers.rst +++ b/docs/Vectorizers.rst @@ -188,6 +188,19 @@ See the table below for a list of these functions. |fma |trunc|nearbyint| +-----+-----+---------+ +Performance +^^^^^^^^^^^ + +This section shows the the execution time of Clang on a simple benchmark: +`gcc-loops `._ +This benchmarks is a collection of loops from the GCC autovectorization +`page ` by Dorit Nuzman._ + +The chart below compares GCC-4.7, ICC-13, and Clang-SVN at -O3, running on a Sandybridge. +The Y-axis shows time in msec. Lower is better. + +.. image:: gcc-loops.png + The Basic Block Vectorizer ========================== diff --git a/docs/gcc-loops.png b/docs/gcc-loops.png new file mode 100644 index 0000000000000000000000000000000000000000..e178146bedd92c88eeba25aba9877ae03c8a6f90 GIT binary patch literal 16653 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 NUIuX^>$>UVe*@?z>Q(>% literal 0 HcmV?d00001 -- 2.34.1