summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorNadav Rotem <nrotem@apple.com>2012-11-02 21:48:17 +0000
committerNadav Rotem <nrotem@apple.com>2012-11-02 21:48:17 +0000
commit6bed58ef240b1e1a1fb41fb867a8ba6e7566e0e9 (patch)
treec071ea892cf774a5eda005215095242eee48fd69 /test
parent2b0c96f71ff1f26617dd805cafa35bf9a29c5a60 (diff)
downloadllvm-6bed58ef240b1e1a1fb41fb867a8ba6e7566e0e9.tar.gz
llvm-6bed58ef240b1e1a1fb41fb867a8ba6e7566e0e9.tar.bz2
llvm-6bed58ef240b1e1a1fb41fb867a8ba6e7566e0e9.tar.xz
Add a cost model analysis that allows us to estimate the cost of IR-level instructions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167324 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r--test/Analysis/CostModel/X86/lit.local.cfg6
-rw-r--r--test/Analysis/CostModel/X86/tiny.ll11
-rw-r--r--test/Analysis/CostModel/X86/vectorized-loop.ll76
-rw-r--r--test/Analysis/CostModel/lit.local.cfg1
-rw-r--r--test/Analysis/CostModel/no_info.ll15
5 files changed, 109 insertions, 0 deletions
diff --git a/test/Analysis/CostModel/X86/lit.local.cfg b/test/Analysis/CostModel/X86/lit.local.cfg
new file mode 100644
index 0000000000..a8ad0f1a28
--- /dev/null
+++ b/test/Analysis/CostModel/X86/lit.local.cfg
@@ -0,0 +1,6 @@
+config.suffixes = ['.ll', '.c', '.cpp']
+
+targets = set(config.root.targets_to_build.split())
+if not 'X86' in targets:
+ config.unsupported = True
+
diff --git a/test/Analysis/CostModel/X86/tiny.ll b/test/Analysis/CostModel/X86/tiny.ll
new file mode 100644
index 0000000000..cc7b443a7d
--- /dev/null
+++ b/test/Analysis/CostModel/X86/tiny.ll
@@ -0,0 +1,11 @@
+; RUN: opt < %s -cost-model -analyze -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx | FileCheck %s
+
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.8.0"
+
+;CHECK: cost of 1 {{.*}} add
+;CHECK: cost of 1 {{.*}} ret
+define i32 @no_info(i32 %arg) {
+ %e = add i32 %arg, %arg
+ ret i32 %e
+}
diff --git a/test/Analysis/CostModel/X86/vectorized-loop.ll b/test/Analysis/CostModel/X86/vectorized-loop.ll
new file mode 100644
index 0000000000..fbf20de515
--- /dev/null
+++ b/test/Analysis/CostModel/X86/vectorized-loop.ll
@@ -0,0 +1,76 @@
+; RUN: opt < %s -cost-model -analyze -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx | FileCheck %s
+
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.8.0"
+
+define i32 @foo(i32* noalias nocapture %A, i32* noalias nocapture %B, i32 %start, i32 %end) nounwind uwtable ssp {
+entry:
+ ;CHECK: cost of 1 {{.*}} icmp
+ %cmp7 = icmp slt i32 %start, %end
+ br i1 %cmp7, label %for.body.lr.ph, label %for.end
+
+for.body.lr.ph: ; preds = %entry
+ ;CHECK: cost of 1 {{.*}} sext
+ %0 = sext i32 %start to i64
+ %1 = sub i32 %end, %start
+ %2 = zext i32 %1 to i64
+ %end.idx = add i64 %2, %0
+ ;CHECK: cost of 1 {{.*}} add
+ %n.vec = and i64 %2, 4294967288
+ %end.idx.rnd.down = add i64 %n.vec, %0
+ ;CHECK: cost of 1 {{.*}} icmp
+ %cmp.zero = icmp eq i64 %n.vec, 0
+ br i1 %cmp.zero, label %middle.block, label %vector.body
+
+vector.body: ; preds = %for.body.lr.ph, %vector.body
+ %index = phi i64 [ %index.next, %vector.body ], [ %0, %for.body.lr.ph ]
+ %3 = add i64 %index, 2
+ %4 = getelementptr inbounds i32* %B, i64 %3
+ ;CHECK: cost of 0 {{.*}} bitcast
+ %5 = bitcast i32* %4 to <8 x i32>*
+ ;CHECK: cost of 1 {{.*}} load
+ %6 = load <8 x i32>* %5, align 4
+ %7 = mul nsw <8 x i32> %6, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
+ %8 = getelementptr inbounds i32* %A, i64 %index
+ %9 = bitcast i32* %8 to <8 x i32>*
+ %10 = load <8 x i32>* %9, align 4
+ %11 = add nsw <8 x i32> %10, %7
+ ;CHECK: cost of 1 {{.*}} store
+ store <8 x i32> %11, <8 x i32>* %9, align 4
+ %index.next = add i64 %index, 8
+ %12 = icmp eq i64 %index.next, %end.idx.rnd.down
+ ;CHECK: cost of 1 {{.*}} br
+ br i1 %12, label %middle.block, label %vector.body
+
+middle.block: ; preds = %vector.body, %for.body.lr.ph
+ %cmp.n = icmp eq i64 %end.idx, %end.idx.rnd.down
+ br i1 %cmp.n, label %for.end, label %for.body
+
+for.body: ; preds = %middle.block, %for.body
+ %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %end.idx.rnd.down, %middle.block ]
+ %13 = add nsw i64 %indvars.iv, 2
+ %arrayidx = getelementptr inbounds i32* %B, i64 %13
+ ;CHECK: cost of 1 {{.*}} load
+ %14 = load i32* %arrayidx, align 4, !tbaa !0
+ ;CHECK: cost of 1 {{.*}} mul
+ %mul = mul nsw i32 %14, 5
+ %arrayidx2 = getelementptr inbounds i32* %A, i64 %indvars.iv
+ ;CHECK: cost of 1 {{.*}} load
+ %15 = load i32* %arrayidx2, align 4, !tbaa !0
+ %add3 = add nsw i32 %15, %mul
+ store i32 %add3, i32* %arrayidx2, align 4, !tbaa !0
+ %indvars.iv.next = add i64 %indvars.iv, 1
+ ;CHECK: cost of 0 {{.*}} trunc
+ %16 = trunc i64 %indvars.iv.next to i32
+ %cmp = icmp slt i32 %16, %end
+ ;CHECK: cost of 1 {{.*}} br
+ br i1 %cmp, label %for.body, label %for.end
+
+for.end: ; preds = %middle.block, %for.body, %entry
+ ;CHECK: cost of 1 {{.*}} ret
+ ret i32 undef
+}
+
+!0 = metadata !{metadata !"int", metadata !1}
+!1 = metadata !{metadata !"omnipotent char", metadata !2}
+!2 = metadata !{metadata !"Simple C/C++ TBAA"}
diff --git a/test/Analysis/CostModel/lit.local.cfg b/test/Analysis/CostModel/lit.local.cfg
new file mode 100644
index 0000000000..19eebc0ac7
--- /dev/null
+++ b/test/Analysis/CostModel/lit.local.cfg
@@ -0,0 +1 @@
+config.suffixes = ['.ll', '.c', '.cpp']
diff --git a/test/Analysis/CostModel/no_info.ll b/test/Analysis/CostModel/no_info.ll
new file mode 100644
index 0000000000..d20d56b79a
--- /dev/null
+++ b/test/Analysis/CostModel/no_info.ll
@@ -0,0 +1,15 @@
+; RUN: opt < %s -cost-model -analyze | FileCheck %s
+
+; The cost model does not have any target information so it can't make a decision.
+; Notice that OPT does not read the triple information from the module itself, only through the command line.
+
+; This info ignored:
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.8.0"
+
+;CHECK: Unknown cost {{.*}} add
+;CHECK: Unknown cost {{.*}} ret
+define i32 @no_info(i32 %arg) {
+ %e = add i32 %arg, %arg
+ ret i32 %e
+}