blob: 56c1a06b42eacf68f648411420fedd37c245b284 [file] [log] [blame]
Hal Finkelc34e5112012-02-01 03:51:43 +00001target 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"
Chandler Carruth7383bfd62013-01-07 10:22:36 +00002; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-ignore-target-info -instcombine -gvn -S | FileCheck %s
3; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-aligned-only -bb-vectorize-ignore-target-info -instcombine -gvn -S | FileCheck %s -check-prefix=CHECK-AO
Hal Finkelc34e5112012-02-01 03:51:43 +00004
5; Simple 3-pair chain with loads and stores
6define void @test1(double* %a, double* %b, double* %c) nounwind uwtable readonly {
7entry:
David Blaikiea79ac142015-02-27 21:17:42 +00008 %i0 = load double, double* %a, align 8
9 %i1 = load double, double* %b, align 8
Hal Finkelc34e5112012-02-01 03:51:43 +000010 %mul = fmul double %i0, %i1
David Blaikie79e6c742015-02-27 19:29:02 +000011 %arrayidx3 = getelementptr inbounds double, double* %a, i64 1
David Blaikiea79ac142015-02-27 21:17:42 +000012 %i3 = load double, double* %arrayidx3, align 8
David Blaikie79e6c742015-02-27 19:29:02 +000013 %arrayidx4 = getelementptr inbounds double, double* %b, i64 1
David Blaikiea79ac142015-02-27 21:17:42 +000014 %i4 = load double, double* %arrayidx4, align 8
Hal Finkelc34e5112012-02-01 03:51:43 +000015 %mul5 = fmul double %i3, %i4
16 store double %mul, double* %c, align 8
David Blaikie79e6c742015-02-27 19:29:02 +000017 %arrayidx5 = getelementptr inbounds double, double* %c, i64 1
Hal Finkelc34e5112012-02-01 03:51:43 +000018 store double %mul5, double* %arrayidx5, align 8
19 ret void
Stephen Linc1c7a132013-07-14 01:42:54 +000020; CHECK-LABEL: @test1(
Hal Finkelc34e5112012-02-01 03:51:43 +000021; CHECK: %i0.v.i0 = bitcast double* %a to <2 x double>*
22; CHECK: %i1.v.i0 = bitcast double* %b to <2 x double>*
David Blaikiea79ac142015-02-27 21:17:42 +000023; CHECK: %i0 = load <2 x double>, <2 x double>* %i0.v.i0, align 8
24; CHECK: %i1 = load <2 x double>, <2 x double>* %i1.v.i0, align 8
Hal Finkelc34e5112012-02-01 03:51:43 +000025; CHECK: %mul = fmul <2 x double> %i0, %i1
26; CHECK: %0 = bitcast double* %c to <2 x double>*
27; CHECK: store <2 x double> %mul, <2 x double>* %0, align 8
28; CHECK: ret void
Stephen Linc1c7a132013-07-14 01:42:54 +000029; CHECK-AO-LABEL: @test1(
Hal Finkelc34e5112012-02-01 03:51:43 +000030; CHECK-AO-NOT: <2 x double>
31}
32
33; Simple chain with extending loads and stores
34define void @test2(float* %a, float* %b, double* %c) nounwind uwtable readonly {
35entry:
David Blaikiea79ac142015-02-27 21:17:42 +000036 %i0f = load float, float* %a, align 4
Hal Finkelc34e5112012-02-01 03:51:43 +000037 %i0 = fpext float %i0f to double
David Blaikiea79ac142015-02-27 21:17:42 +000038 %i1f = load float, float* %b, align 4
Hal Finkelc34e5112012-02-01 03:51:43 +000039 %i1 = fpext float %i1f to double
40 %mul = fmul double %i0, %i1
David Blaikie79e6c742015-02-27 19:29:02 +000041 %arrayidx3 = getelementptr inbounds float, float* %a, i64 1
David Blaikiea79ac142015-02-27 21:17:42 +000042 %i3f = load float, float* %arrayidx3, align 4
Hal Finkelc34e5112012-02-01 03:51:43 +000043 %i3 = fpext float %i3f to double
David Blaikie79e6c742015-02-27 19:29:02 +000044 %arrayidx4 = getelementptr inbounds float, float* %b, i64 1
David Blaikiea79ac142015-02-27 21:17:42 +000045 %i4f = load float, float* %arrayidx4, align 4
Hal Finkelc34e5112012-02-01 03:51:43 +000046 %i4 = fpext float %i4f to double
47 %mul5 = fmul double %i3, %i4
48 store double %mul, double* %c, align 8
David Blaikie79e6c742015-02-27 19:29:02 +000049 %arrayidx5 = getelementptr inbounds double, double* %c, i64 1
Hal Finkelc34e5112012-02-01 03:51:43 +000050 store double %mul5, double* %arrayidx5, align 8
51 ret void
Stephen Linc1c7a132013-07-14 01:42:54 +000052; CHECK-LABEL: @test2(
Hal Finkelc34e5112012-02-01 03:51:43 +000053; CHECK: %i0f.v.i0 = bitcast float* %a to <2 x float>*
54; CHECK: %i1f.v.i0 = bitcast float* %b to <2 x float>*
David Blaikiea79ac142015-02-27 21:17:42 +000055; CHECK: %i0f = load <2 x float>, <2 x float>* %i0f.v.i0, align 4
Hal Finkelc34e5112012-02-01 03:51:43 +000056; CHECK: %i0 = fpext <2 x float> %i0f to <2 x double>
David Blaikiea79ac142015-02-27 21:17:42 +000057; CHECK: %i1f = load <2 x float>, <2 x float>* %i1f.v.i0, align 4
Hal Finkelc34e5112012-02-01 03:51:43 +000058; CHECK: %i1 = fpext <2 x float> %i1f to <2 x double>
59; CHECK: %mul = fmul <2 x double> %i0, %i1
60; CHECK: %0 = bitcast double* %c to <2 x double>*
61; CHECK: store <2 x double> %mul, <2 x double>* %0, align 8
62; CHECK: ret void
Stephen Linc1c7a132013-07-14 01:42:54 +000063; CHECK-AO-LABEL: @test2(
Hal Finkelc34e5112012-02-01 03:51:43 +000064; CHECK-AO-NOT: <2 x double>
65}
66
67; Simple chain with loads and truncating stores
68define void @test3(double* %a, double* %b, float* %c) nounwind uwtable readonly {
69entry:
David Blaikiea79ac142015-02-27 21:17:42 +000070 %i0 = load double, double* %a, align 8
71 %i1 = load double, double* %b, align 8
Hal Finkelc34e5112012-02-01 03:51:43 +000072 %mul = fmul double %i0, %i1
73 %mulf = fptrunc double %mul to float
David Blaikie79e6c742015-02-27 19:29:02 +000074 %arrayidx3 = getelementptr inbounds double, double* %a, i64 1
David Blaikiea79ac142015-02-27 21:17:42 +000075 %i3 = load double, double* %arrayidx3, align 8
David Blaikie79e6c742015-02-27 19:29:02 +000076 %arrayidx4 = getelementptr inbounds double, double* %b, i64 1
David Blaikiea79ac142015-02-27 21:17:42 +000077 %i4 = load double, double* %arrayidx4, align 8
Hal Finkelc34e5112012-02-01 03:51:43 +000078 %mul5 = fmul double %i3, %i4
79 %mul5f = fptrunc double %mul5 to float
80 store float %mulf, float* %c, align 8
David Blaikie79e6c742015-02-27 19:29:02 +000081 %arrayidx5 = getelementptr inbounds float, float* %c, i64 1
Hal Finkelc34e5112012-02-01 03:51:43 +000082 store float %mul5f, float* %arrayidx5, align 4
83 ret void
Stephen Linc1c7a132013-07-14 01:42:54 +000084; CHECK-LABEL: @test3(
Hal Finkelc34e5112012-02-01 03:51:43 +000085; CHECK: %i0.v.i0 = bitcast double* %a to <2 x double>*
86; CHECK: %i1.v.i0 = bitcast double* %b to <2 x double>*
David Blaikiea79ac142015-02-27 21:17:42 +000087; CHECK: %i0 = load <2 x double>, <2 x double>* %i0.v.i0, align 8
88; CHECK: %i1 = load <2 x double>, <2 x double>* %i1.v.i0, align 8
Hal Finkelc34e5112012-02-01 03:51:43 +000089; CHECK: %mul = fmul <2 x double> %i0, %i1
90; CHECK: %mulf = fptrunc <2 x double> %mul to <2 x float>
91; CHECK: %0 = bitcast float* %c to <2 x float>*
92; CHECK: store <2 x float> %mulf, <2 x float>* %0, align 8
93; CHECK: ret void
Stephen Linc1c7a132013-07-14 01:42:54 +000094; CHECK-AO-LABEL: @test3(
David Blaikiea79ac142015-02-27 21:17:42 +000095; CHECK-AO: %i0 = load double, double* %a, align 8
96; CHECK-AO: %i1 = load double, double* %b, align 8
David Blaikie79e6c742015-02-27 19:29:02 +000097; CHECK-AO: %arrayidx3 = getelementptr inbounds double, double* %a, i64 1
David Blaikiea79ac142015-02-27 21:17:42 +000098; CHECK-AO: %i3 = load double, double* %arrayidx3, align 8
David Blaikie79e6c742015-02-27 19:29:02 +000099; CHECK-AO: %arrayidx4 = getelementptr inbounds double, double* %b, i64 1
David Blaikiea79ac142015-02-27 21:17:42 +0000100; CHECK-AO: %i4 = load double, double* %arrayidx4, align 8
Hal Finkel842ad0b2012-10-31 15:17:07 +0000101; CHECK-AO: %mul.v.i1.1 = insertelement <2 x double> undef, double %i1, i32 0
Hal Finkelc34e5112012-02-01 03:51:43 +0000102; CHECK-AO: %mul.v.i1.2 = insertelement <2 x double> %mul.v.i1.1, double %i4, i32 1
Hal Finkel842ad0b2012-10-31 15:17:07 +0000103; CHECK-AO: %mul.v.i0.1 = insertelement <2 x double> undef, double %i0, i32 0
Hal Finkelc34e5112012-02-01 03:51:43 +0000104; CHECK-AO: %mul.v.i0.2 = insertelement <2 x double> %mul.v.i0.1, double %i3, i32 1
105; CHECK-AO: %mul = fmul <2 x double> %mul.v.i0.2, %mul.v.i1.2
106; CHECK-AO: %mulf = fptrunc <2 x double> %mul to <2 x float>
107; CHECK-AO: %0 = bitcast float* %c to <2 x float>*
108; CHECK-AO: store <2 x float> %mulf, <2 x float>* %0, align 8
109; CHECK-AO: ret void
110}
Hal Finkel931c52b2012-10-22 18:00:55 +0000111
112; Simple 3-pair chain with loads and stores (unreachable)
113define void @test4(i1 %bool, double* %a, double* %b, double* %c) nounwind uwtable readonly {
114entry:
115 br i1 %bool, label %if.then1, label %if.end
116
117if.then1:
118 unreachable
119 br label %if.then
120
121if.then:
David Blaikiea79ac142015-02-27 21:17:42 +0000122 %i0 = load double, double* %a, align 8
123 %i1 = load double, double* %b, align 8
Hal Finkel931c52b2012-10-22 18:00:55 +0000124 %mul = fmul double %i0, %i1
David Blaikie79e6c742015-02-27 19:29:02 +0000125 %arrayidx3 = getelementptr inbounds double, double* %a, i64 1
David Blaikiea79ac142015-02-27 21:17:42 +0000126 %i3 = load double, double* %arrayidx3, align 8
David Blaikie79e6c742015-02-27 19:29:02 +0000127 %arrayidx4 = getelementptr inbounds double, double* %b, i64 1
David Blaikiea79ac142015-02-27 21:17:42 +0000128 %i4 = load double, double* %arrayidx4, align 8
Hal Finkel931c52b2012-10-22 18:00:55 +0000129 %mul5 = fmul double %i3, %i4
130 store double %mul, double* %c, align 8
David Blaikie79e6c742015-02-27 19:29:02 +0000131 %arrayidx5 = getelementptr inbounds double, double* %c, i64 1
Hal Finkel931c52b2012-10-22 18:00:55 +0000132 store double %mul5, double* %arrayidx5, align 8
133 br label %if.end
134
135if.end:
136 ret void
Stephen Linc1c7a132013-07-14 01:42:54 +0000137; CHECK-LABEL: @test4(
Hal Finkel931c52b2012-10-22 18:00:55 +0000138; CHECK-NOT: <2 x double>
Stephen Linc1c7a132013-07-14 01:42:54 +0000139; CHECK-AO-LABEL: @test4(
Hal Finkel931c52b2012-10-22 18:00:55 +0000140; CHECK-AO-NOT: <2 x double>
141}
142
Hal Finkel2eaadd12012-10-30 19:47:37 +0000143; Simple 3-pair chain with loads and stores
144define void @test5(double* %a, double* %b, double* %c) nounwind uwtable readonly {
145entry:
David Blaikiea79ac142015-02-27 21:17:42 +0000146 %i0 = load double, double* %a, align 8
147 %i1 = load double, double* %b, align 8
Hal Finkel2eaadd12012-10-30 19:47:37 +0000148 %mul = fmul double %i0, %i1
David Blaikie79e6c742015-02-27 19:29:02 +0000149 %arrayidx3 = getelementptr inbounds double, double* %a, i64 1
David Blaikiea79ac142015-02-27 21:17:42 +0000150 %i3 = load double, double* %arrayidx3, align 8
David Blaikie79e6c742015-02-27 19:29:02 +0000151 %arrayidx4 = getelementptr inbounds double, double* %b, i64 1
David Blaikiea79ac142015-02-27 21:17:42 +0000152 %i4 = load double, double* %arrayidx4, align 8
Hal Finkel2eaadd12012-10-30 19:47:37 +0000153 %mul5 = fmul double %i3, %i4
David Blaikie79e6c742015-02-27 19:29:02 +0000154 %arrayidx5 = getelementptr inbounds double, double* %c, i64 1
Hal Finkel2eaadd12012-10-30 19:47:37 +0000155 store double %mul5, double* %arrayidx5, align 8
156 store double %mul, double* %c, align 4
157 ret void
Stephen Linc1c7a132013-07-14 01:42:54 +0000158; CHECK-LABEL: @test5(
Hal Finkel2eaadd12012-10-30 19:47:37 +0000159; CHECK: %i0.v.i0 = bitcast double* %a to <2 x double>*
160; CHECK: %i1.v.i0 = bitcast double* %b to <2 x double>*
David Blaikiea79ac142015-02-27 21:17:42 +0000161; CHECK: %i0 = load <2 x double>, <2 x double>* %i0.v.i0, align 8
162; CHECK: %i1 = load <2 x double>, <2 x double>* %i1.v.i0, align 8
Hal Finkel2eaadd12012-10-30 19:47:37 +0000163; CHECK: %mul = fmul <2 x double> %i0, %i1
164; CHECK: %0 = bitcast double* %c to <2 x double>*
165; CHECK: store <2 x double> %mul, <2 x double>* %0, align 4
166; CHECK: ret void
Stephen Linc1c7a132013-07-14 01:42:54 +0000167; CHECK-AO-LABEL: @test5(
Hal Finkel2eaadd12012-10-30 19:47:37 +0000168; CHECK-AO-NOT: <2 x double>
169}
170