aboutsummaryrefslogtreecommitdiff
path: root/test/Analysis/CostModel
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2013-06-10 20:36:52 +0000
committerDimitry Andric <dim@FreeBSD.org>2013-06-10 20:36:52 +0000
commit59d6cff90eecf31cb3dd860c4e786674cfdd42eb (patch)
tree909310b2e05119d1d6efda049977042abbb58bb1 /test/Analysis/CostModel
parent4a16efa3e43e35f0cc9efe3a67f620f0017c3d36 (diff)
Notes
Diffstat (limited to 'test/Analysis/CostModel')
-rw-r--r--test/Analysis/CostModel/ARM/cast.ll4
-rw-r--r--test/Analysis/CostModel/ARM/divrem.ll450
-rw-r--r--test/Analysis/CostModel/X86/arith.ll4
-rw-r--r--test/Analysis/CostModel/X86/loop_v2.ll8
-rw-r--r--test/Analysis/CostModel/X86/sitofp.ll281
-rw-r--r--test/Analysis/CostModel/X86/testshiftashr.ll8
-rw-r--r--test/Analysis/CostModel/X86/testshiftlshr.ll9
-rw-r--r--test/Analysis/CostModel/X86/testshiftshl.ll9
-rw-r--r--test/Analysis/CostModel/X86/uitofp.ll368
-rw-r--r--test/Analysis/CostModel/X86/vectorized-loop.ll10
10 files changed, 1120 insertions, 31 deletions
diff --git a/test/Analysis/CostModel/ARM/cast.ll b/test/Analysis/CostModel/ARM/cast.ll
index ba9d84cf3e23..0cdd61cac4f7 100644
--- a/test/Analysis/CostModel/ARM/cast.ll
+++ b/test/Analysis/CostModel/ARM/cast.ll
@@ -175,9 +175,9 @@ define i32 @casts() {
%rext_5 = zext <4 x i16> undef to <4 x i64>
; Vector cast cost of instructions lowering the cast to the stack.
- ; CHECK: cost of 19 {{.*}} trunc
+ ; CHECK: cost of 3 {{.*}} trunc
%r74 = trunc <8 x i32> undef to <8 x i8>
- ; CHECK: cost of 38 {{.*}} trunc
+ ; CHECK: cost of 6 {{.*}} trunc
%r75 = trunc <16 x i32> undef to <16 x i8>
; Floating point truncation costs.
diff --git a/test/Analysis/CostModel/ARM/divrem.ll b/test/Analysis/CostModel/ARM/divrem.ll
new file mode 100644
index 000000000000..c4ac59b59e0a
--- /dev/null
+++ b/test/Analysis/CostModel/ARM/divrem.ll
@@ -0,0 +1,450 @@
+; RUN: opt < %s -cost-model -analyze -mtriple=thumbv7-apple-ios6.0.0 -mcpu=cortex-a9 | FileCheck %s
+
+define <2 x i8> @sdiv_v2_i8(<2 x i8> %a, <2 x i8> %b) {
+ ; CHECK: sdiv_v2_i8
+ ; CHECK: cost of 40 {{.*}} sdiv
+
+ %1 = sdiv <2 x i8> %a, %b
+ ret <2 x i8> %1
+}
+define <2 x i16> @sdiv_v2_i16(<2 x i16> %a, <2 x i16> %b) {
+ ; CHECK: sdiv_v2_i16
+ ; CHECK: cost of 40 {{.*}} sdiv
+
+ %1 = sdiv <2 x i16> %a, %b
+ ret <2 x i16> %1
+}
+define <2 x i32> @sdiv_v2_i32(<2 x i32> %a, <2 x i32> %b) {
+ ; CHECK: sdiv_v2_i32
+ ; CHECK: cost of 40 {{.*}} sdiv
+
+ %1 = sdiv <2 x i32> %a, %b
+ ret <2 x i32> %1
+}
+define <2 x i64> @sdiv_v2_i64(<2 x i64> %a, <2 x i64> %b) {
+ ; CHECK: sdiv_v2_i64
+ ; CHECK: cost of 40 {{.*}} sdiv
+
+ %1 = sdiv <2 x i64> %a, %b
+ ret <2 x i64> %1
+}
+define <4 x i8> @sdiv_v4_i8(<4 x i8> %a, <4 x i8> %b) {
+ ; CHECK: sdiv_v4_i8
+ ; CHECK: cost of 10 {{.*}} sdiv
+
+ %1 = sdiv <4 x i8> %a, %b
+ ret <4 x i8> %1
+}
+define <4 x i16> @sdiv_v4_i16(<4 x i16> %a, <4 x i16> %b) {
+ ; CHECK: sdiv_v4_i16
+ ; CHECK: cost of 10 {{.*}} sdiv
+
+ %1 = sdiv <4 x i16> %a, %b
+ ret <4 x i16> %1
+}
+define <4 x i32> @sdiv_v4_i32(<4 x i32> %a, <4 x i32> %b) {
+ ; CHECK: sdiv_v4_i32
+ ; CHECK: cost of 80 {{.*}} sdiv
+
+ %1 = sdiv <4 x i32> %a, %b
+ ret <4 x i32> %1
+}
+define <4 x i64> @sdiv_v4_i64(<4 x i64> %a, <4 x i64> %b) {
+ ; CHECK: sdiv_v4_i64
+ ; CHECK: cost of 80 {{.*}} sdiv
+
+ %1 = sdiv <4 x i64> %a, %b
+ ret <4 x i64> %1
+}
+define <8 x i8> @sdiv_v8_i8(<8 x i8> %a, <8 x i8> %b) {
+ ; CHECK: sdiv_v8_i8
+ ; CHECK: cost of 10 {{.*}} sdiv
+
+ %1 = sdiv <8 x i8> %a, %b
+ ret <8 x i8> %1
+}
+define <8 x i16> @sdiv_v8_i16(<8 x i16> %a, <8 x i16> %b) {
+ ; CHECK: sdiv_v8_i16
+ ; CHECK: cost of 160 {{.*}} sdiv
+
+ %1 = sdiv <8 x i16> %a, %b
+ ret <8 x i16> %1
+}
+define <8 x i32> @sdiv_v8_i32(<8 x i32> %a, <8 x i32> %b) {
+ ; CHECK: sdiv_v8_i32
+ ; CHECK: cost of 160 {{.*}} sdiv
+
+ %1 = sdiv <8 x i32> %a, %b
+ ret <8 x i32> %1
+}
+define <8 x i64> @sdiv_v8_i64(<8 x i64> %a, <8 x i64> %b) {
+ ; CHECK: sdiv_v8_i64
+ ; CHECK: cost of 160 {{.*}} sdiv
+
+ %1 = sdiv <8 x i64> %a, %b
+ ret <8 x i64> %1
+}
+define <16 x i8> @sdiv_v16_i8(<16 x i8> %a, <16 x i8> %b) {
+ ; CHECK: sdiv_v16_i8
+ ; CHECK: cost of 320 {{.*}} sdiv
+
+ %1 = sdiv <16 x i8> %a, %b
+ ret <16 x i8> %1
+}
+define <16 x i16> @sdiv_v16_i16(<16 x i16> %a, <16 x i16> %b) {
+ ; CHECK: sdiv_v16_i16
+ ; CHECK: cost of 320 {{.*}} sdiv
+
+ %1 = sdiv <16 x i16> %a, %b
+ ret <16 x i16> %1
+}
+define <16 x i32> @sdiv_v16_i32(<16 x i32> %a, <16 x i32> %b) {
+ ; CHECK: sdiv_v16_i32
+ ; CHECK: cost of 320 {{.*}} sdiv
+
+ %1 = sdiv <16 x i32> %a, %b
+ ret <16 x i32> %1
+}
+define <16 x i64> @sdiv_v16_i64(<16 x i64> %a, <16 x i64> %b) {
+ ; CHECK: sdiv_v16_i64
+ ; CHECK: cost of 320 {{.*}} sdiv
+
+ %1 = sdiv <16 x i64> %a, %b
+ ret <16 x i64> %1
+}
+define <2 x i8> @udiv_v2_i8(<2 x i8> %a, <2 x i8> %b) {
+ ; CHECK: udiv_v2_i8
+ ; CHECK: cost of 40 {{.*}} udiv
+
+ %1 = udiv <2 x i8> %a, %b
+ ret <2 x i8> %1
+}
+define <2 x i16> @udiv_v2_i16(<2 x i16> %a, <2 x i16> %b) {
+ ; CHECK: udiv_v2_i16
+ ; CHECK: cost of 40 {{.*}} udiv
+
+ %1 = udiv <2 x i16> %a, %b
+ ret <2 x i16> %1
+}
+define <2 x i32> @udiv_v2_i32(<2 x i32> %a, <2 x i32> %b) {
+ ; CHECK: udiv_v2_i32
+ ; CHECK: cost of 40 {{.*}} udiv
+
+ %1 = udiv <2 x i32> %a, %b
+ ret <2 x i32> %1
+}
+define <2 x i64> @udiv_v2_i64(<2 x i64> %a, <2 x i64> %b) {
+ ; CHECK: udiv_v2_i64
+ ; CHECK: cost of 40 {{.*}} udiv
+
+ %1 = udiv <2 x i64> %a, %b
+ ret <2 x i64> %1
+}
+define <4 x i8> @udiv_v4_i8(<4 x i8> %a, <4 x i8> %b) {
+ ; CHECK: udiv_v4_i8
+ ; CHECK: cost of 10 {{.*}} udiv
+
+ %1 = udiv <4 x i8> %a, %b
+ ret <4 x i8> %1
+}
+define <4 x i16> @udiv_v4_i16(<4 x i16> %a, <4 x i16> %b) {
+ ; CHECK: udiv_v4_i16
+ ; CHECK: cost of 10 {{.*}} udiv
+
+ %1 = udiv <4 x i16> %a, %b
+ ret <4 x i16> %1
+}
+define <4 x i32> @udiv_v4_i32(<4 x i32> %a, <4 x i32> %b) {
+ ; CHECK: udiv_v4_i32
+ ; CHECK: cost of 80 {{.*}} udiv
+
+ %1 = udiv <4 x i32> %a, %b
+ ret <4 x i32> %1
+}
+define <4 x i64> @udiv_v4_i64(<4 x i64> %a, <4 x i64> %b) {
+ ; CHECK: udiv_v4_i64
+ ; CHECK: cost of 80 {{.*}} udiv
+
+ %1 = udiv <4 x i64> %a, %b
+ ret <4 x i64> %1
+}
+define <8 x i8> @udiv_v8_i8(<8 x i8> %a, <8 x i8> %b) {
+ ; CHECK: udiv_v8_i8
+ ; CHECK: cost of 10 {{.*}} udiv
+
+ %1 = udiv <8 x i8> %a, %b
+ ret <8 x i8> %1
+}
+define <8 x i16> @udiv_v8_i16(<8 x i16> %a, <8 x i16> %b) {
+ ; CHECK: udiv_v8_i16
+ ; CHECK: cost of 160 {{.*}} udiv
+
+ %1 = udiv <8 x i16> %a, %b
+ ret <8 x i16> %1
+}
+define <8 x i32> @udiv_v8_i32(<8 x i32> %a, <8 x i32> %b) {
+ ; CHECK: udiv_v8_i32
+ ; CHECK: cost of 160 {{.*}} udiv
+
+ %1 = udiv <8 x i32> %a, %b
+ ret <8 x i32> %1
+}
+define <8 x i64> @udiv_v8_i64(<8 x i64> %a, <8 x i64> %b) {
+ ; CHECK: udiv_v8_i64
+ ; CHECK: cost of 160 {{.*}} udiv
+
+ %1 = udiv <8 x i64> %a, %b
+ ret <8 x i64> %1
+}
+define <16 x i8> @udiv_v16_i8(<16 x i8> %a, <16 x i8> %b) {
+ ; CHECK: udiv_v16_i8
+ ; CHECK: cost of 320 {{.*}} udiv
+
+ %1 = udiv <16 x i8> %a, %b
+ ret <16 x i8> %1
+}
+define <16 x i16> @udiv_v16_i16(<16 x i16> %a, <16 x i16> %b) {
+ ; CHECK: udiv_v16_i16
+ ; CHECK: cost of 320 {{.*}} udiv
+
+ %1 = udiv <16 x i16> %a, %b
+ ret <16 x i16> %1
+}
+define <16 x i32> @udiv_v16_i32(<16 x i32> %a, <16 x i32> %b) {
+ ; CHECK: udiv_v16_i32
+ ; CHECK: cost of 320 {{.*}} udiv
+
+ %1 = udiv <16 x i32> %a, %b
+ ret <16 x i32> %1
+}
+define <16 x i64> @udiv_v16_i64(<16 x i64> %a, <16 x i64> %b) {
+ ; CHECK: udiv_v16_i64
+ ; CHECK: cost of 320 {{.*}} udiv
+
+ %1 = udiv <16 x i64> %a, %b
+ ret <16 x i64> %1
+}
+define <2 x i8> @srem_v2_i8(<2 x i8> %a, <2 x i8> %b) {
+ ; CHECK: srem_v2_i8
+ ; CHECK: cost of 40 {{.*}} srem
+
+ %1 = srem <2 x i8> %a, %b
+ ret <2 x i8> %1
+}
+define <2 x i16> @srem_v2_i16(<2 x i16> %a, <2 x i16> %b) {
+ ; CHECK: srem_v2_i16
+ ; CHECK: cost of 40 {{.*}} srem
+
+ %1 = srem <2 x i16> %a, %b
+ ret <2 x i16> %1
+}
+define <2 x i32> @srem_v2_i32(<2 x i32> %a, <2 x i32> %b) {
+ ; CHECK: srem_v2_i32
+ ; CHECK: cost of 40 {{.*}} srem
+
+ %1 = srem <2 x i32> %a, %b
+ ret <2 x i32> %1
+}
+define <2 x i64> @srem_v2_i64(<2 x i64> %a, <2 x i64> %b) {
+ ; CHECK: srem_v2_i64
+ ; CHECK: cost of 40 {{.*}} srem
+
+ %1 = srem <2 x i64> %a, %b
+ ret <2 x i64> %1
+}
+define <4 x i8> @srem_v4_i8(<4 x i8> %a, <4 x i8> %b) {
+ ; CHECK: srem_v4_i8
+ ; CHECK: cost of 80 {{.*}} srem
+
+ %1 = srem <4 x i8> %a, %b
+ ret <4 x i8> %1
+}
+define <4 x i16> @srem_v4_i16(<4 x i16> %a, <4 x i16> %b) {
+ ; CHECK: srem_v4_i16
+ ; CHECK: cost of 80 {{.*}} srem
+
+ %1 = srem <4 x i16> %a, %b
+ ret <4 x i16> %1
+}
+define <4 x i32> @srem_v4_i32(<4 x i32> %a, <4 x i32> %b) {
+ ; CHECK: srem_v4_i32
+ ; CHECK: cost of 80 {{.*}} srem
+
+ %1 = srem <4 x i32> %a, %b
+ ret <4 x i32> %1
+}
+define <4 x i64> @srem_v4_i64(<4 x i64> %a, <4 x i64> %b) {
+ ; CHECK: srem_v4_i64
+ ; CHECK: cost of 80 {{.*}} srem
+
+ %1 = srem <4 x i64> %a, %b
+ ret <4 x i64> %1
+}
+define <8 x i8> @srem_v8_i8(<8 x i8> %a, <8 x i8> %b) {
+ ; CHECK: srem_v8_i8
+ ; CHECK: cost of 160 {{.*}} srem
+
+ %1 = srem <8 x i8> %a, %b
+ ret <8 x i8> %1
+}
+define <8 x i16> @srem_v8_i16(<8 x i16> %a, <8 x i16> %b) {
+ ; CHECK: srem_v8_i16
+ ; CHECK: cost of 160 {{.*}} srem
+
+ %1 = srem <8 x i16> %a, %b
+ ret <8 x i16> %1
+}
+define <8 x i32> @srem_v8_i32(<8 x i32> %a, <8 x i32> %b) {
+ ; CHECK: srem_v8_i32
+ ; CHECK: cost of 160 {{.*}} srem
+
+ %1 = srem <8 x i32> %a, %b
+ ret <8 x i32> %1
+}
+define <8 x i64> @srem_v8_i64(<8 x i64> %a, <8 x i64> %b) {
+ ; CHECK: srem_v8_i64
+ ; CHECK: cost of 160 {{.*}} srem
+
+ %1 = srem <8 x i64> %a, %b
+ ret <8 x i64> %1
+}
+define <16 x i8> @srem_v16_i8(<16 x i8> %a, <16 x i8> %b) {
+ ; CHECK: srem_v16_i8
+ ; CHECK: cost of 320 {{.*}} srem
+
+ %1 = srem <16 x i8> %a, %b
+ ret <16 x i8> %1
+}
+define <16 x i16> @srem_v16_i16(<16 x i16> %a, <16 x i16> %b) {
+ ; CHECK: srem_v16_i16
+ ; CHECK: cost of 320 {{.*}} srem
+
+ %1 = srem <16 x i16> %a, %b
+ ret <16 x i16> %1
+}
+define <16 x i32> @srem_v16_i32(<16 x i32> %a, <16 x i32> %b) {
+ ; CHECK: srem_v16_i32
+ ; CHECK: cost of 320 {{.*}} srem
+
+ %1 = srem <16 x i32> %a, %b
+ ret <16 x i32> %1
+}
+define <16 x i64> @srem_v16_i64(<16 x i64> %a, <16 x i64> %b) {
+ ; CHECK: srem_v16_i64
+ ; CHECK: cost of 320 {{.*}} srem
+
+ %1 = srem <16 x i64> %a, %b
+ ret <16 x i64> %1
+}
+define <2 x i8> @urem_v2_i8(<2 x i8> %a, <2 x i8> %b) {
+ ; CHECK: urem_v2_i8
+ ; CHECK: cost of 40 {{.*}} urem
+
+ %1 = urem <2 x i8> %a, %b
+ ret <2 x i8> %1
+}
+define <2 x i16> @urem_v2_i16(<2 x i16> %a, <2 x i16> %b) {
+ ; CHECK: urem_v2_i16
+ ; CHECK: cost of 40 {{.*}} urem
+
+ %1 = urem <2 x i16> %a, %b
+ ret <2 x i16> %1
+}
+define <2 x i32> @urem_v2_i32(<2 x i32> %a, <2 x i32> %b) {
+ ; CHECK: urem_v2_i32
+ ; CHECK: cost of 40 {{.*}} urem
+
+ %1 = urem <2 x i32> %a, %b
+ ret <2 x i32> %1
+}
+define <2 x i64> @urem_v2_i64(<2 x i64> %a, <2 x i64> %b) {
+ ; CHECK: urem_v2_i64
+ ; CHECK: cost of 40 {{.*}} urem
+
+ %1 = urem <2 x i64> %a, %b
+ ret <2 x i64> %1
+}
+define <4 x i8> @urem_v4_i8(<4 x i8> %a, <4 x i8> %b) {
+ ; CHECK: urem_v4_i8
+ ; CHECK: cost of 80 {{.*}} urem
+
+ %1 = urem <4 x i8> %a, %b
+ ret <4 x i8> %1
+}
+define <4 x i16> @urem_v4_i16(<4 x i16> %a, <4 x i16> %b) {
+ ; CHECK: urem_v4_i16
+ ; CHECK: cost of 80 {{.*}} urem
+
+ %1 = urem <4 x i16> %a, %b
+ ret <4 x i16> %1
+}
+define <4 x i32> @urem_v4_i32(<4 x i32> %a, <4 x i32> %b) {
+ ; CHECK: urem_v4_i32
+ ; CHECK: cost of 80 {{.*}} urem
+
+ %1 = urem <4 x i32> %a, %b
+ ret <4 x i32> %1
+}
+define <4 x i64> @urem_v4_i64(<4 x i64> %a, <4 x i64> %b) {
+ ; CHECK: urem_v4_i64
+ ; CHECK: cost of 80 {{.*}} urem
+
+ %1 = urem <4 x i64> %a, %b
+ ret <4 x i64> %1
+}
+define <8 x i8> @urem_v8_i8(<8 x i8> %a, <8 x i8> %b) {
+ ; CHECK: urem_v8_i8
+ ; CHECK: cost of 160 {{.*}} urem
+
+ %1 = urem <8 x i8> %a, %b
+ ret <8 x i8> %1
+}
+define <8 x i16> @urem_v8_i16(<8 x i16> %a, <8 x i16> %b) {
+ ; CHECK: urem_v8_i16
+ ; CHECK: cost of 160 {{.*}} urem
+
+ %1 = urem <8 x i16> %a, %b
+ ret <8 x i16> %1
+}
+define <8 x i32> @urem_v8_i32(<8 x i32> %a, <8 x i32> %b) {
+ ; CHECK: urem_v8_i32
+ ; CHECK: cost of 160 {{.*}} urem
+
+ %1 = urem <8 x i32> %a, %b
+ ret <8 x i32> %1
+}
+define <8 x i64> @urem_v8_i64(<8 x i64> %a, <8 x i64> %b) {
+ ; CHECK: urem_v8_i64
+ ; CHECK: cost of 160 {{.*}} urem
+
+ %1 = urem <8 x i64> %a, %b
+ ret <8 x i64> %1
+}
+define <16 x i8> @urem_v16_i8(<16 x i8> %a, <16 x i8> %b) {
+ ; CHECK: urem_v16_i8
+ ; CHECK: cost of 320 {{.*}} urem
+
+ %1 = urem <16 x i8> %a, %b
+ ret <16 x i8> %1
+}
+define <16 x i16> @urem_v16_i16(<16 x i16> %a, <16 x i16> %b) {
+ ; CHECK: urem_v16_i16
+ ; CHECK: cost of 320 {{.*}} urem
+
+ %1 = urem <16 x i16> %a, %b
+ ret <16 x i16> %1
+}
+define <16 x i32> @urem_v16_i32(<16 x i32> %a, <16 x i32> %b) {
+ ; CHECK: urem_v16_i32
+ ; CHECK: cost of 320 {{.*}} urem
+
+ %1 = urem <16 x i32> %a, %b
+ ret <16 x i32> %1
+}
+define <16 x i64> @urem_v16_i64(<16 x i64> %a, <16 x i64> %b) {
+ ; CHECK: urem_v16_i64
+ ; CHECK: cost of 320 {{.*}} urem
+
+ %1 = urem <16 x i64> %a, %b
+ ret <16 x i64> %1
+}
diff --git a/test/Analysis/CostModel/X86/arith.ll b/test/Analysis/CostModel/X86/arith.ll
index 85b442533f41..92f5a1ec3a00 100644
--- a/test/Analysis/CostModel/X86/arith.ll
+++ b/test/Analysis/CostModel/X86/arith.ll
@@ -66,9 +66,9 @@ define void @avx2mull() {
; CHECK: fmul
define i32 @fmul(i32 %arg) {
- ;CHECK: cost of 1 {{.*}} fmul
+ ;CHECK: cost of 2 {{.*}} fmul
%A = fmul <4 x float> undef, undef
- ;CHECK: cost of 1 {{.*}} fmul
+ ;CHECK: cost of 2 {{.*}} fmul
%B = fmul <8 x float> undef, undef
ret i32 undef
}
diff --git a/test/Analysis/CostModel/X86/loop_v2.ll b/test/Analysis/CostModel/X86/loop_v2.ll
index 260a60676ab7..348444eb0833 100644
--- a/test/Analysis/CostModel/X86/loop_v2.ll
+++ b/test/Analysis/CostModel/X86/loop_v2.ll
@@ -20,10 +20,10 @@ vector.body: ; preds = %vector.body, %vecto
;CHECK: cost of 1 {{.*}} extract
%6 = extractelement <2 x i64> %3, i32 1
%7 = getelementptr inbounds i32* %A, i64 %6
- %8 = load i32* %5, align 4, !tbaa !0
+ %8 = load i32* %5, align 4
;CHECK: cost of 1 {{.*}} insert
%9 = insertelement <2 x i32> undef, i32 %8, i32 0
- %10 = load i32* %7, align 4, !tbaa !0
+ %10 = load i32* %7, align 4
;CHECK: cost of 1 {{.*}} insert
%11 = insertelement <2 x i32> %9, i32 %10, i32 1
%12 = add nsw <2 x i32> %11, %vec.phi
@@ -37,7 +37,3 @@ for.end: ; preds = %vector.body
%16 = add i32 %14, %15
ret i32 %16
}
-
-!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/X86/sitofp.ll b/test/Analysis/CostModel/X86/sitofp.ll
new file mode 100644
index 000000000000..338d97416526
--- /dev/null
+++ b/test/Analysis/CostModel/X86/sitofp.ll
@@ -0,0 +1,281 @@
+; RUN: opt -mtriple=x86_64-apple-darwin -mcpu=core2 -cost-model -analyze < %s | FileCheck --check-prefix=SSE2 %s
+
+define <2 x double> @sitofpv2i8v2double(<2 x i8> %a) {
+ ; SSE2: sitofpv2i8v2double
+ ; SSE2: cost of 20 {{.*}} sitofp
+ %1 = sitofp <2 x i8> %a to <2 x double>
+ ret <2 x double> %1
+}
+
+define <4 x double> @sitofpv4i8v4double(<4 x i8> %a) {
+ ; SSE2: sitofpv4i8v4double
+ ; SSE2: cost of 40 {{.*}} sitofp
+ %1 = sitofp <4 x i8> %a to <4 x double>
+ ret <4 x double> %1
+}
+
+define <8 x double> @sitofpv8i8v8double(<8 x i8> %a) {
+ ; SSE2: sitofpv8i8v8double
+ ; SSE2: cost of 80 {{.*}} sitofp
+%1 = sitofp <8 x i8> %a to <8 x double>
+ ret <8 x double> %1
+}
+
+define <16 x double> @sitofpv16i8v16double(<16 x i8> %a) {
+ ; SSE2: sitofpv16i8v16double
+ ; SSE2: cost of 160 {{.*}} sitofp
+ %1 = sitofp <16 x i8> %a to <16 x double>
+ ret <16 x double> %1
+}
+
+define <32 x double> @sitofpv32i8v32double(<32 x i8> %a) {
+ ; SSE2: sitofpv32i8v32double
+ ; SSE2: cost of 320 {{.*}} sitofp
+ %1 = sitofp <32 x i8> %a to <32 x double>
+ ret <32 x double> %1
+}
+
+define <2 x double> @sitofpv2i16v2double(<2 x i16> %a) {
+ ; SSE2: sitofpv2i16v2double
+ ; SSE2: cost of 20 {{.*}} sitofp
+ %1 = sitofp <2 x i16> %a to <2 x double>
+ ret <2 x double> %1
+}
+
+define <4 x double> @sitofpv4i16v4double(<4 x i16> %a) {
+ ; SSE2: sitofpv4i16v4double
+ ; SSE2: cost of 40 {{.*}} sitofp
+ %1 = sitofp <4 x i16> %a to <4 x double>
+ ret <4 x double> %1
+}
+
+define <8 x double> @sitofpv8i16v8double(<8 x i16> %a) {
+ ; SSE2: sitofpv8i16v8double
+ ; SSE2: cost of 80 {{.*}} sitofp
+ %1 = sitofp <8 x i16> %a to <8 x double>
+ ret <8 x double> %1
+}
+
+define <16 x double> @sitofpv16i16v16double(<16 x i16> %a) {
+ ; SSE2: sitofpv16i16v16double
+ ; SSE2: cost of 160 {{.*}} sitofp
+ %1 = sitofp <16 x i16> %a to <16 x double>
+ ret <16 x double> %1
+}
+
+define <32 x double> @sitofpv32i16v32double(<32 x i16> %a) {
+ ; SSE2: sitofpv32i16v32double
+ ; SSE2: cost of 320 {{.*}} sitofp
+ %1 = sitofp <32 x i16> %a to <32 x double>
+ ret <32 x double> %1
+}
+
+define <2 x double> @sitofpv2i32v2double(<2 x i32> %a) {
+ ; SSE2: sitofpv2i32v2double
+ ; SSE2: cost of 20 {{.*}} sitofp
+ %1 = sitofp <2 x i32> %a to <2 x double>
+ ret <2 x double> %1
+}
+
+define <4 x double> @sitofpv4i32v4double(<4 x i32> %a) {
+ ; SSE2: sitofpv4i32v4double
+ ; SSE2: cost of 40 {{.*}} sitofp
+ %1 = sitofp <4 x i32> %a to <4 x double>
+ ret <4 x double> %1
+}
+
+define <8 x double> @sitofpv8i32v8double(<8 x i32> %a) {
+ ; SSE2: sitofpv8i32v8double
+ ; SSE2: cost of 80 {{.*}} sitofp
+ %1 = sitofp <8 x i32> %a to <8 x double>
+ ret <8 x double> %1
+}
+
+define <16 x double> @sitofpv16i32v16double(<16 x i32> %a) {
+ ; SSE2: sitofpv16i32v16double
+ ; SSE2: cost of 160 {{.*}} sitofp
+ %1 = sitofp <16 x i32> %a to <16 x double>
+ ret <16 x double> %1
+}
+
+define <32 x double> @sitofpv32i32v32double(<32 x i32> %a) {
+ ; SSE2: sitofpv32i32v32double
+ ; SSE2: cost of 320 {{.*}} sitofp
+ %1 = sitofp <32 x i32> %a to <32 x double>
+ ret <32 x double> %1
+}
+
+define <2 x double> @sitofpv2i64v2double(<2 x i64> %a) {
+ ; SSE2: sitofpv2i64v2double
+ ; SSE2: cost of 20 {{.*}} sitofp
+ %1 = sitofp <2 x i64> %a to <2 x double>
+ ret <2 x double> %1
+}
+
+define <4 x double> @sitofpv4i64v4double(<4 x i64> %a) {
+ ; SSE2: sitofpv4i64v4double
+ ; SSE2: cost of 40 {{.*}} sitofp
+ %1 = sitofp <4 x i64> %a to <4 x double>
+ ret <4 x double> %1
+}
+
+define <8 x double> @sitofpv8i64v8double(<8 x i64> %a) {
+ %1 = sitofp <8 x i64> %a to <8 x double>
+ ; SSE2: sitofpv8i64v8double
+ ; SSE2: cost of 80 {{.*}} sitofp
+ ret <8 x double> %1
+}
+
+define <16 x double> @sitofpv16i64v16double(<16 x i64> %a) {
+ ; SSE2: sitofpv16i64v16double
+ ; SSE2: cost of 160 {{.*}} sitofp
+ %1 = sitofp <16 x i64> %a to <16 x double>
+ ret <16 x double> %1
+}
+
+define <32 x double> @sitofpv32i64v32double(<32 x i64> %a) {
+ ; SSE2: sitofpv32i64v32double
+ ; SSE2: cost of 320 {{.*}} sitofp
+ %1 = sitofp <32 x i64> %a to <32 x double>
+ ret <32 x double> %1
+}
+
+define <2 x float> @sitofpv2i8v2float(<2 x i8> %a) {
+ ; SSE2: sitofpv2i8v2float
+ ; SSE2: cost of 15 {{.*}} sitofp
+ %1 = sitofp <2 x i8> %a to <2 x float>
+ ret <2 x float> %1
+}
+
+define <4 x float> @sitofpv4i8v4float(<4 x i8> %a) {
+ ; SSE2: sitofpv4i8v4float
+ ; SSE2: cost of 15 {{.*}} sitofp
+ %1 = sitofp <4 x i8> %a to <4 x float>
+ ret <4 x float> %1
+}
+
+define <8 x float> @sitofpv8i8v8float(<8 x i8> %a) {
+ ; SSE2: sitofpv8i8v8float
+ ; SSE2: cost of 15 {{.*}} sitofp
+ %1 = sitofp <8 x i8> %a to <8 x float>
+ ret <8 x float> %1
+}
+
+define <16 x float> @sitofpv16i8v16float(<16 x i8> %a) {
+ ; SSE2: sitofpv16i8v16float
+ ; SSE2: cost of 8 {{.*}} sitofp
+ %1 = sitofp <16 x i8> %a to <16 x float>
+ ret <16 x float> %1
+}
+
+define <32 x float> @sitofpv32i8v32float(<32 x i8> %a) {
+ ; SSE2: sitofpv32i8v32float
+ ; SSE2: cost of 16 {{.*}} sitofp
+ %1 = sitofp <32 x i8> %a to <32 x float>
+ ret <32 x float> %1
+}
+
+define <2 x float> @sitofpv2i16v2float(<2 x i16> %a) {
+ ; SSE2: sitofpv2i16v2float
+ ; SSE2: cost of 15 {{.*}} sitofp
+ %1 = sitofp <2 x i16> %a to <2 x float>
+ ret <2 x float> %1
+}
+
+define <4 x float> @sitofpv4i16v4float(<4 x i16> %a) {
+ ; SSE2: sitofpv4i16v4float
+ ; SSE2: cost of 15 {{.*}} sitofp
+ %1 = sitofp <4 x i16> %a to <4 x float>
+ ret <4 x float> %1
+}
+
+define <8 x float> @sitofpv8i16v8float(<8 x i16> %a) {
+ ; SSE2: sitofpv8i16v8float
+ ; SSE2: cost of 15 {{.*}} sitofp
+ %1 = sitofp <8 x i16> %a to <8 x float>
+ ret <8 x float> %1
+}
+
+define <16 x float> @sitofpv16i16v16float(<16 x i16> %a) {
+ ; SSE2: sitofpv16i16v16float
+ ; SSE2: cost of 30 {{.*}} sitofp
+ %1 = sitofp <16 x i16> %a to <16 x float>
+ ret <16 x float> %1
+}
+
+define <32 x float> @sitofpv32i16v32float(<32 x i16> %a) {
+ ; SSE2: sitofpv32i16v32float
+ ; SSE2: cost of 60 {{.*}} sitofp
+ %1 = sitofp <32 x i16> %a to <32 x float>
+ ret <32 x float> %1
+}
+
+define <2 x float> @sitofpv2i32v2float(<2 x i32> %a) {
+ ; SSE2: sitofpv2i32v2float
+ ; SSE2: cost of 15 {{.*}} sitofp
+ %1 = sitofp <2 x i32> %a to <2 x float>
+ ret <2 x float> %1
+}
+
+define <4 x float> @sitofpv4i32v4float(<4 x i32> %a) {
+ ; SSE2: sitofpv4i32v4float
+ ; SSE2: cost of 15 {{.*}} sitofp
+ %1 = sitofp <4 x i32> %a to <4 x float>
+ ret <4 x float> %1
+}
+
+define <8 x float> @sitofpv8i32v8float(<8 x i32> %a) {
+ ; SSE2: sitofpv8i32v8float
+ ; SSE2: cost of 30 {{.*}} sitofp
+ %1 = sitofp <8 x i32> %a to <8 x float>
+ ret <8 x float> %1
+}
+
+define <16 x float> @sitofpv16i32v16float(<16 x i32> %a) {
+ ; SSE2: sitofpv16i32v16float
+ ; SSE2: cost of 60 {{.*}} sitofp
+ %1 = sitofp <16 x i32> %a to <16 x float>
+ ret <16 x float> %1
+}
+
+define <32 x float> @sitofpv32i32v32float(<32 x i32> %a) {
+ ; SSE2: sitofpv32i32v32float
+ ; SSE2: cost of 120 {{.*}} sitofp
+ %1 = sitofp <32 x i32> %a to <32 x float>
+ ret <32 x float> %1
+}
+
+define <2 x float> @sitofpv2i64v2float(<2 x i64> %a) {
+ ; SSE2: sitofpv2i64v2float
+ ; SSE2: cost of 15 {{.*}} sitofp
+ %1 = sitofp <2 x i64> %a to <2 x float>
+ ret <2 x float> %1
+}
+
+define <4 x float> @sitofpv4i64v4float(<4 x i64> %a) {
+ ; SSE2: sitofpv4i64v4float
+ ; SSE2: cost of 30 {{.*}} sitofp
+ %1 = sitofp <4 x i64> %a to <4 x float>
+ ret <4 x float> %1
+}
+
+define <8 x float> @sitofpv8i64v8float(<8 x i64> %a) {
+ ; SSE2: sitofpv8i64v8float
+ ; SSE2: cost of 60 {{.*}} sitofp
+ %1 = sitofp <8 x i64> %a to <8 x float>
+ ret <8 x float> %1
+}
+
+define <16 x float> @sitofpv16i64v16float(<16 x i64> %a) {
+ ; SSE2: sitofpv16i64v16float
+ ; SSE2: cost of 120 {{.*}} sitofp
+ %1 = sitofp <16 x i64> %a to <16 x float>
+ ret <16 x float> %1
+}
+
+define <32 x float> @sitofpv32i64v32float(<32 x i64> %a) {
+ ; SSE2: sitofpv32i64v32float
+ ; SSE2: cost of 240 {{.*}} sitofp
+ %1 = sitofp <32 x i64> %a to <32 x float>
+ ret <32 x float> %1
+}
diff --git a/test/Analysis/CostModel/X86/testshiftashr.ll b/test/Analysis/CostModel/X86/testshiftashr.ll
index f35eea87164c..d96a92fe2a8a 100644
--- a/test/Analysis/CostModel/X86/testshiftashr.ll
+++ b/test/Analysis/CostModel/X86/testshiftashr.ll
@@ -113,7 +113,7 @@ entry:
define %shifttype32i32 @shift32i32(%shifttype32i32 %a, %shifttype32i32 %b) {
entry:
; SSE2: shift32i32
- ; SSE2: cost of 256 {{.*}} ashr
+ ; SSE2: cost of 320 {{.*}} ashr
; SSE2-CODEGEN: shift32i32
; SSE2-CODEGEN: sarl %cl
@@ -173,7 +173,7 @@ entry:
define %shifttype32i64 @shift32i64(%shifttype32i64 %a, %shifttype32i64 %b) {
entry:
; SSE2: shift32i64
- ; SSE2: cost of 256 {{.*}} ashr
+ ; SSE2: cost of 320 {{.*}} ashr
; SSE2-CODEGEN: shift32i64
; SSE2-CODEGEN: sarq %cl
@@ -373,7 +373,7 @@ define %shifttypec32i32 @shift32i32c(%shifttypec32i32 %a, %shifttypec32i32 %b) {
entry:
; SSE2: shift32i32c
; getTypeConversion fails here and promotes this to a i64.
- ; SSE2: cost of 256 {{.*}} ashr
+ ; SSE2: cost of 8 {{.*}} ashr
; SSE2-CODEGEN: shift32i32c
; SSE2-CODEGEN: psrad $3
%0 = ashr %shifttypec32i32 %a , <i32 3, i32 3, i32 3, i32 3,
@@ -443,7 +443,7 @@ entry:
define %shifttypec32i64 @shift32i64c(%shifttypec32i64 %a, %shifttypec32i64 %b) {
entry:
; SSE2: shift32i64c
- ; SSE2: cost of 256 {{.*}} ashr
+ ; SSE2: cost of 320 {{.*}} ashr
; SSE2-CODEGEN: shift32i64c
; SSE2-CODEGEN: sarq $3
diff --git a/test/Analysis/CostModel/X86/testshiftlshr.ll b/test/Analysis/CostModel/X86/testshiftlshr.ll
index 8d6ef3874208..7bc8d89e4ad8 100644
--- a/test/Analysis/CostModel/X86/testshiftlshr.ll
+++ b/test/Analysis/CostModel/X86/testshiftlshr.ll
@@ -113,7 +113,7 @@ entry:
define %shifttype32i32 @shift32i32(%shifttype32i32 %a, %shifttype32i32 %b) {
entry:
; SSE2: shift32i32
- ; SSE2: cost of 256 {{.*}} lshr
+ ; SSE2: cost of 320 {{.*}} lshr
; SSE2-CODEGEN: shift32i32
; SSE2-CODEGEN: shrl %cl
@@ -173,7 +173,7 @@ entry:
define %shifttype32i64 @shift32i64(%shifttype32i64 %a, %shifttype32i64 %b) {
entry:
; SSE2: shift32i64
- ; SSE2: cost of 256 {{.*}} lshr
+ ; SSE2: cost of 320 {{.*}} lshr
; SSE2-CODEGEN: shift32i64
; SSE2-CODEGEN: shrq %cl
@@ -372,8 +372,7 @@ entry:
define %shifttypec32i32 @shift32i32c(%shifttypec32i32 %a, %shifttypec32i32 %b) {
entry:
; SSE2: shift32i32c
- ; getTypeConversion fails here and promotes this to a i64.
- ; SSE2: cost of 256 {{.*}} lshr
+ ; SSE2: cost of 8 {{.*}} lshr
; SSE2-CODEGEN: shift32i32c
; SSE2-CODEGEN: psrld $3
%0 = lshr %shifttypec32i32 %a , <i32 3, i32 3, i32 3, i32 3,
@@ -443,7 +442,7 @@ entry:
define %shifttypec32i64 @shift32i64c(%shifttypec32i64 %a, %shifttypec32i64 %b) {
entry:
; SSE2: shift32i64c
- ; SSE2: cost of 256 {{.*}} lshr
+ ; SSE2: cost of 16 {{.*}} lshr
; SSE2-CODEGEN: shift32i64c
; SSE2-CODEGEN: psrlq $3
diff --git a/test/Analysis/CostModel/X86/testshiftshl.ll b/test/Analysis/CostModel/X86/testshiftshl.ll
index f45a69879210..40effd02922c 100644
--- a/test/Analysis/CostModel/X86/testshiftshl.ll
+++ b/test/Analysis/CostModel/X86/testshiftshl.ll
@@ -113,7 +113,7 @@ entry:
define %shifttype32i32 @shift32i32(%shifttype32i32 %a, %shifttype32i32 %b) {
entry:
; SSE2: shift32i32
- ; SSE2: cost of 256 {{.*}} shl
+ ; SSE2: cost of 80 {{.*}} shl
; SSE2-CODEGEN: shift32i32
; SSE2-CODEGEN: pmuludq
@@ -173,7 +173,7 @@ entry:
define %shifttype32i64 @shift32i64(%shifttype32i64 %a, %shifttype32i64 %b) {
entry:
; SSE2: shift32i64
- ; SSE2: cost of 256 {{.*}} shl
+ ; SSE2: cost of 320 {{.*}} shl
; SSE2-CODEGEN: shift32i64
; SSE2-CODEGEN: shlq %cl
@@ -372,8 +372,7 @@ entry:
define %shifttypec32i32 @shift32i32c(%shifttypec32i32 %a, %shifttypec32i32 %b) {
entry:
; SSE2: shift32i32c
- ; getTypeConversion fails here and promotes this to a i64.
- ; SSE2: cost of 256 {{.*}} shl
+ ; SSE2: cost of 8 {{.*}} shl
; SSE2-CODEGEN: shift32i32c
; SSE2-CODEGEN: pslld $3
%0 = shl %shifttypec32i32 %a , <i32 3, i32 3, i32 3, i32 3,
@@ -443,7 +442,7 @@ entry:
define %shifttypec32i64 @shift32i64c(%shifttypec32i64 %a, %shifttypec32i64 %b) {
entry:
; SSE2: shift32i64c
- ; SSE2: cost of 256 {{.*}} shl
+ ; SSE2: cost of 16 {{.*}} shl
; SSE2-CODEGEN: shift32i64c
; SSE2-CODEGEN: psllq $3
diff --git a/test/Analysis/CostModel/X86/uitofp.ll b/test/Analysis/CostModel/X86/uitofp.ll
new file mode 100644
index 000000000000..a41a04df84ec
--- /dev/null
+++ b/test/Analysis/CostModel/X86/uitofp.ll
@@ -0,0 +1,368 @@
+; RUN: llc -mtriple=x86_64-apple-darwin -mcpu=core2 < %s | FileCheck --check-prefix=SSE2-CODEGEN %s
+; RUN: opt -mtriple=x86_64-apple-darwin -mcpu=core2 -cost-model -analyze < %s | FileCheck --check-prefix=SSE2 %s
+
+; In X86TargetTransformInfo::getCastInstrCost we have code that depends on
+; getSimpleVT on a value type. On AVX2 we execute this code. Make sure we exit
+; early if the type is not a simple value type before we call this function.
+; RUN: opt -mtriple=x86_64-apple-darwin -mcpu=core-avx2 -cost-model -analyze < %s
+
+define <2 x double> @uitofpv2i8v2double(<2 x i8> %a) {
+ ; SSE2: uitofpv2i8v2double
+ ; SSE2: cost of 20 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv2i8v2double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ %1 = uitofp <2 x i8> %a to <2 x double>
+ ret <2 x double> %1
+}
+
+define <4 x double> @uitofpv4i8v4double(<4 x i8> %a) {
+ ; SSE2: uitofpv4i8v4double
+ ; SSE2: cost of 40 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv4i8v4double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ %1 = uitofp <4 x i8> %a to <4 x double>
+ ret <4 x double> %1
+}
+
+define <8 x double> @uitofpv8i8v8double(<8 x i8> %a) {
+ ; SSE2: uitofpv8i8v8double
+ ; SSE2: cost of 80 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv8i8v8double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+%1 = uitofp <8 x i8> %a to <8 x double>
+ ret <8 x double> %1
+}
+
+define <16 x double> @uitofpv16i8v16double(<16 x i8> %a) {
+ ; SSE2: uitofpv16i8v16double
+ ; SSE2: cost of 160 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv16i8v16double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ %1 = uitofp <16 x i8> %a to <16 x double>
+ ret <16 x double> %1
+}
+
+define <32 x double> @uitofpv32i8v32double(<32 x i8> %a) {
+ ; SSE2: uitofpv32i8v32double
+ ; SSE2: cost of 320 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv32i8v32double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ %1 = uitofp <32 x i8> %a to <32 x double>
+ ret <32 x double> %1
+}
+
+define <2 x double> @uitofpv2i16v2double(<2 x i16> %a) {
+ ; SSE2: uitofpv2i16v2double
+ ; SSE2: cost of 20 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv2i16v2double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ %1 = uitofp <2 x i16> %a to <2 x double>
+ ret <2 x double> %1
+}
+
+define <4 x double> @uitofpv4i16v4double(<4 x i16> %a) {
+ ; SSE2: uitofpv4i16v4double
+ ; SSE2: cost of 40 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv4i16v4double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ %1 = uitofp <4 x i16> %a to <4 x double>
+ ret <4 x double> %1
+}
+
+define <8 x double> @uitofpv8i16v8double(<8 x i16> %a) {
+ ; SSE2: uitofpv8i16v8double
+ ; SSE2: cost of 80 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv8i16v8double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ %1 = uitofp <8 x i16> %a to <8 x double>
+ ret <8 x double> %1
+}
+
+define <16 x double> @uitofpv16i16v16double(<16 x i16> %a) {
+ ; SSE2: uitofpv16i16v16double
+ ; SSE2: cost of 160 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv16i16v16double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ %1 = uitofp <16 x i16> %a to <16 x double>
+ ret <16 x double> %1
+}
+
+define <32 x double> @uitofpv32i16v32double(<32 x i16> %a) {
+ ; SSE2: uitofpv32i16v32double
+ ; SSE2: cost of 320 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv32i16v32double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ %1 = uitofp <32 x i16> %a to <32 x double>
+ ret <32 x double> %1
+}
+
+define <2 x double> @uitofpv2i32v2double(<2 x i32> %a) {
+ ; SSE2: uitofpv2i32v2double
+ ; SSE2: cost of 20 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv2i32v2double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ %1 = uitofp <2 x i32> %a to <2 x double>
+ ret <2 x double> %1
+}
+
+define <4 x double> @uitofpv4i32v4double(<4 x i32> %a) {
+ ; SSE2: uitofpv4i32v4double
+ ; SSE2: cost of 40 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv4i32v4double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ %1 = uitofp <4 x i32> %a to <4 x double>
+ ret <4 x double> %1
+}
+
+define <8 x double> @uitofpv8i32v8double(<8 x i32> %a) {
+ ; SSE2: uitofpv8i32v8double
+ ; SSE2: cost of 80 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv8i32v8double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ %1 = uitofp <8 x i32> %a to <8 x double>
+ ret <8 x double> %1
+}
+
+define <16 x double> @uitofpv16i32v16double(<16 x i32> %a) {
+ ; SSE2: uitofpv16i32v16double
+ ; SSE2: cost of 160 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv16i32v16double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ %1 = uitofp <16 x i32> %a to <16 x double>
+ ret <16 x double> %1
+}
+
+define <32 x double> @uitofpv32i32v32double(<32 x i32> %a) {
+ ; SSE2: uitofpv32i32v32double
+ ; SSE2: cost of 320 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv32i32v32double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ %1 = uitofp <32 x i32> %a to <32 x double>
+ ret <32 x double> %1
+}
+
+define <2 x double> @uitofpv2i64v2double(<2 x i64> %a) {
+ ; SSE2: uitofpv2i64v2double
+ ; SSE2: cost of 20 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv2i64v2double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ %1 = uitofp <2 x i64> %a to <2 x double>
+ ret <2 x double> %1
+}
+
+define <4 x double> @uitofpv4i64v4double(<4 x i64> %a) {
+ ; SSE2: uitofpv4i64v4double
+ ; SSE2: cost of 40 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv4i64v4double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ %1 = uitofp <4 x i64> %a to <4 x double>
+ ret <4 x double> %1
+}
+
+define <8 x double> @uitofpv8i64v8double(<8 x i64> %a) {
+ %1 = uitofp <8 x i64> %a to <8 x double>
+ ; SSE2: uitofpv8i64v8double
+ ; SSE2: cost of 80 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv8i64v8double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ ret <8 x double> %1
+}
+
+define <16 x double> @uitofpv16i64v16double(<16 x i64> %a) {
+ ; SSE2: uitofpv16i64v16double
+ ; SSE2: cost of 160 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv16i64v16double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ %1 = uitofp <16 x i64> %a to <16 x double>
+ ret <16 x double> %1
+}
+
+define <32 x double> @uitofpv32i64v32double(<32 x i64> %a) {
+ ; SSE2: uitofpv32i64v32double
+ ; SSE2: cost of 320 {{.*}} uitofp
+ ; SSE2-CODEGEN: uitofpv32i64v32double
+ ; SSE2-CODEGEN: movapd LCPI
+ ; SSE2-CODEGEN: subpd
+ ; SSE2-CODEGEN: addpd
+ %1 = uitofp <32 x i64> %a to <32 x double>
+ ret <32 x double> %1
+}
+
+define <2 x float> @uitofpv2i8v2float(<2 x i8> %a) {
+ ; SSE2: uitofpv2i8v2float
+ ; SSE2: cost of 15 {{.*}} uitofp
+ %1 = uitofp <2 x i8> %a to <2 x float>
+ ret <2 x float> %1
+}
+
+define <4 x float> @uitofpv4i8v4float(<4 x i8> %a) {
+ ; SSE2: uitofpv4i8v4float
+ ; SSE2: cost of 15 {{.*}} uitofp
+ %1 = uitofp <4 x i8> %a to <4 x float>
+ ret <4 x float> %1
+}
+
+define <8 x float> @uitofpv8i8v8float(<8 x i8> %a) {
+ ; SSE2: uitofpv8i8v8float
+ ; SSE2: cost of 15 {{.*}} uitofp
+ %1 = uitofp <8 x i8> %a to <8 x float>
+ ret <8 x float> %1
+}
+
+define <16 x float> @uitofpv16i8v16float(<16 x i8> %a) {
+ ; SSE2: uitofpv16i8v16float
+ ; SSE2: cost of 8 {{.*}} uitofp
+ %1 = uitofp <16 x i8> %a to <16 x float>
+ ret <16 x float> %1
+}
+
+define <32 x float> @uitofpv32i8v32float(<32 x i8> %a) {
+ ; SSE2: uitofpv32i8v32float
+ ; SSE2: cost of 16 {{.*}} uitofp
+ %1 = uitofp <32 x i8> %a to <32 x float>
+ ret <32 x float> %1
+}
+
+define <2 x float> @uitofpv2i16v2float(<2 x i16> %a) {
+ ; SSE2: uitofpv2i16v2float
+ ; SSE2: cost of 15 {{.*}} uitofp
+ %1 = uitofp <2 x i16> %a to <2 x float>
+ ret <2 x float> %1
+}
+
+define <4 x float> @uitofpv4i16v4float(<4 x i16> %a) {
+ ; SSE2: uitofpv4i16v4float
+ ; SSE2: cost of 15 {{.*}} uitofp
+ %1 = uitofp <4 x i16> %a to <4 x float>
+ ret <4 x float> %1
+}
+
+define <8 x float> @uitofpv8i16v8float(<8 x i16> %a) {
+ ; SSE2: uitofpv8i16v8float
+ ; SSE2: cost of 15 {{.*}} uitofp
+ %1 = uitofp <8 x i16> %a to <8 x float>
+ ret <8 x float> %1
+}
+
+define <16 x float> @uitofpv16i16v16float(<16 x i16> %a) {
+ ; SSE2: uitofpv16i16v16float
+ ; SSE2: cost of 30 {{.*}} uitofp
+ %1 = uitofp <16 x i16> %a to <16 x float>
+ ret <16 x float> %1
+}
+
+define <32 x float> @uitofpv32i16v32float(<32 x i16> %a) {
+ ; SSE2: uitofpv32i16v32float
+ ; SSE2: cost of 60 {{.*}} uitofp
+ %1 = uitofp <32 x i16> %a to <32 x float>
+ ret <32 x float> %1
+}
+
+define <2 x float> @uitofpv2i32v2float(<2 x i32> %a) {
+ ; SSE2: uitofpv2i32v2float
+ ; SSE2: cost of 15 {{.*}} uitofp
+ %1 = uitofp <2 x i32> %a to <2 x float>
+ ret <2 x float> %1
+}
+
+define <4 x float> @uitofpv4i32v4float(<4 x i32> %a) {
+ ; SSE2: uitofpv4i32v4float
+ ; SSE2: cost of 15 {{.*}} uitofp
+ %1 = uitofp <4 x i32> %a to <4 x float>
+ ret <4 x float> %1
+}
+
+define <8 x float> @uitofpv8i32v8float(<8 x i32> %a) {
+ ; SSE2: uitofpv8i32v8float
+ ; SSE2: cost of 30 {{.*}} uitofp
+ %1 = uitofp <8 x i32> %a to <8 x float>
+ ret <8 x float> %1
+}
+
+define <16 x float> @uitofpv16i32v16float(<16 x i32> %a) {
+ ; SSE2: uitofpv16i32v16float
+ ; SSE2: cost of 60 {{.*}} uitofp
+ %1 = uitofp <16 x i32> %a to <16 x float>
+ ret <16 x float> %1
+}
+
+define <32 x float> @uitofpv32i32v32float(<32 x i32> %a) {
+ ; SSE2: uitofpv32i32v32float
+ ; SSE2: cost of 120 {{.*}} uitofp
+ %1 = uitofp <32 x i32> %a to <32 x float>
+ ret <32 x float> %1
+}
+
+define <2 x float> @uitofpv2i64v2float(<2 x i64> %a) {
+ ; SSE2: uitofpv2i64v2float
+ ; SSE2: cost of 15 {{.*}} uitofp
+ %1 = uitofp <2 x i64> %a to <2 x float>
+ ret <2 x float> %1
+}
+
+define <4 x float> @uitofpv4i64v4float(<4 x i64> %a) {
+ ; SSE2: uitofpv4i64v4float
+ ; SSE2: cost of 30 {{.*}} uitofp
+ %1 = uitofp <4 x i64> %a to <4 x float>
+ ret <4 x float> %1
+}
+
+define <8 x float> @uitofpv8i64v8float(<8 x i64> %a) {
+ ; SSE2: uitofpv8i64v8float
+ ; SSE2: cost of 60 {{.*}} uitofp
+ %1 = uitofp <8 x i64> %a to <8 x float>
+ ret <8 x float> %1
+}
+
+define <16 x float> @uitofpv16i64v16float(<16 x i64> %a) {
+ ; SSE2: uitofpv16i64v16float
+ ; SSE2: cost of 120 {{.*}} uitofp
+ %1 = uitofp <16 x i64> %a to <16 x float>
+ ret <16 x float> %1
+}
+
+define <32 x float> @uitofpv32i64v32float(<32 x i64> %a) {
+ ; SSE2: uitofpv32i64v32float
+ ; SSE2: cost of 240 {{.*}} uitofp
+ %1 = uitofp <32 x i64> %a to <32 x float>
+ ret <32 x float> %1
+}
+
diff --git a/test/Analysis/CostModel/X86/vectorized-loop.ll b/test/Analysis/CostModel/X86/vectorized-loop.ll
index 25b11145c661..af7d1df8a570 100644
--- a/test/Analysis/CostModel/X86/vectorized-loop.ll
+++ b/test/Analysis/CostModel/X86/vectorized-loop.ll
@@ -54,14 +54,14 @@ for.body: ; preds = %middle.block, %for.
%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
+ %14 = load i32* %arrayidx, align 4
;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
+ %15 = load i32* %arrayidx2, align 4
%add3 = add nsw i32 %15, %mul
- store i32 %add3, i32* %arrayidx2, align 4, !tbaa !0
+ store i32 %add3, i32* %arrayidx2, align 4
%indvars.iv.next = add i64 %indvars.iv, 1
;CHECK: cost of 0 {{.*}} trunc
%16 = trunc i64 %indvars.iv.next to i32
@@ -73,7 +73,3 @@ for.end: ; preds = %middle.block, %for.
;CHECK: cost of 0 {{.*}} ret
ret i32 undef
}
-
-!0 = metadata !{metadata !"int", metadata !1}
-!1 = metadata !{metadata !"omnipotent char", metadata !2}
-!2 = metadata !{metadata !"Simple C/C++ TBAA"}