InstCombineSimplifyDemanded: Remove nsw/nuw flags when optimizing demanded bits
[oota-llvm.git] / test / Transforms / InstCombine / aligned-qpx.ll
1 ; RUN: opt -S -instcombine < %s | FileCheck %s
2 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-f128:128:128-v128:128:128-n32:64"
3 target triple = "powerpc64-unknown-linux-gnu"
4
5 declare <4 x double> @llvm.ppc.qpx.qvlfs(i8*) #1
6
7 define <4 x double> @test1(<4 x float>* %h) #0 {
8 entry:
9   %h1 = getelementptr <4 x float>, <4 x float>* %h, i64 1
10   %hv = bitcast <4 x float>* %h1 to i8*
11   %vl = call <4 x double> @llvm.ppc.qpx.qvlfs(i8* %hv)
12
13 ; CHECK-LABEL: @test1
14 ; CHECK: @llvm.ppc.qpx.qvlfs
15 ; CHECK: ret <4 x double>
16
17   %v0 = load <4 x float>, <4 x float>* %h, align 8
18   %v0e = fpext <4 x float> %v0 to <4 x double>
19   %a = fadd <4 x double> %v0e, %vl
20   ret <4 x double> %a
21 }
22
23 define <4 x double> @test1a(<4 x float>* align 16 %h) #0 {
24 entry:
25   %h1 = getelementptr <4 x float>, <4 x float>* %h, i64 1
26   %hv = bitcast <4 x float>* %h1 to i8*
27   %vl = call <4 x double> @llvm.ppc.qpx.qvlfs(i8* %hv)
28
29 ; CHECK-LABEL: @test1a
30 ; CHECK-NOT: @llvm.ppc.qpx.qvlfs
31 ; CHECK: ret <4 x double>
32
33   %v0 = load <4 x float>, <4 x float>* %h, align 8
34   %v0e = fpext <4 x float> %v0 to <4 x double>
35   %a = fadd <4 x double> %v0e, %vl
36   ret <4 x double> %a
37 }
38
39 declare void @llvm.ppc.qpx.qvstfs(<4 x double>, i8*) #0
40
41 define <4 x float> @test2(<4 x float>* %h, <4 x double> %d) #0 {
42 entry:
43   %h1 = getelementptr <4 x float>, <4 x float>* %h, i64 1
44   %hv = bitcast <4 x float>* %h1 to i8*
45   call void @llvm.ppc.qpx.qvstfs(<4 x double> %d, i8* %hv)
46
47   %v0 = load <4 x float>, <4 x float>* %h, align 8
48   ret <4 x float> %v0
49
50 ; CHECK-LABEL: @test2
51 ; CHECK: @llvm.ppc.qpx.qvstfs
52 ; CHECK: ret <4 x float>
53 }
54
55 define <4 x float> @test2a(<4 x float>* align 16 %h, <4 x double> %d) #0 {
56 entry:
57   %h1 = getelementptr <4 x float>, <4 x float>* %h, i64 1
58   %hv = bitcast <4 x float>* %h1 to i8*
59   call void @llvm.ppc.qpx.qvstfs(<4 x double> %d, i8* %hv)
60
61   %v0 = load <4 x float>, <4 x float>* %h, align 8
62   ret <4 x float> %v0
63
64 ; CHECK-LABEL: @test2
65 ; CHECK-NOT: @llvm.ppc.qpx.qvstfs
66 ; CHECK: ret <4 x float>
67 }
68
69 declare <4 x double> @llvm.ppc.qpx.qvlfd(i8*) #1
70
71 define <4 x double> @test1l(<4 x double>* %h) #0 {
72 entry:
73   %h1 = getelementptr <4 x double>, <4 x double>* %h, i64 1
74   %hv = bitcast <4 x double>* %h1 to i8*
75   %vl = call <4 x double> @llvm.ppc.qpx.qvlfd(i8* %hv)
76
77 ; CHECK-LABEL: @test1l
78 ; CHECK: @llvm.ppc.qpx.qvlfd
79 ; CHECK: ret <4 x double>
80
81   %v0 = load <4 x double>, <4 x double>* %h, align 8
82   %a = fadd <4 x double> %v0, %vl
83   ret <4 x double> %a
84 }
85
86 define <4 x double> @test1ln(<4 x double>* align 16 %h) #0 {
87 entry:
88   %h1 = getelementptr <4 x double>, <4 x double>* %h, i64 1
89   %hv = bitcast <4 x double>* %h1 to i8*
90   %vl = call <4 x double> @llvm.ppc.qpx.qvlfd(i8* %hv)
91
92 ; CHECK-LABEL: @test1ln
93 ; CHECK: @llvm.ppc.qpx.qvlfd
94 ; CHECK: ret <4 x double>
95
96   %v0 = load <4 x double>, <4 x double>* %h, align 8
97   %a = fadd <4 x double> %v0, %vl
98   ret <4 x double> %a
99 }
100
101 define <4 x double> @test1la(<4 x double>* align 32 %h) #0 {
102 entry:
103   %h1 = getelementptr <4 x double>, <4 x double>* %h, i64 1
104   %hv = bitcast <4 x double>* %h1 to i8*
105   %vl = call <4 x double> @llvm.ppc.qpx.qvlfd(i8* %hv)
106
107 ; CHECK-LABEL: @test1la
108 ; CHECK-NOT: @llvm.ppc.qpx.qvlfd
109 ; CHECK: ret <4 x double>
110
111   %v0 = load <4 x double>, <4 x double>* %h, align 8
112   %a = fadd <4 x double> %v0, %vl
113   ret <4 x double> %a
114 }
115
116 declare void @llvm.ppc.qpx.qvstfd(<4 x double>, i8*) #0
117
118 define <4 x double> @test2l(<4 x double>* %h, <4 x double> %d) #0 {
119 entry:
120   %h1 = getelementptr <4 x double>, <4 x double>* %h, i64 1
121   %hv = bitcast <4 x double>* %h1 to i8*
122   call void @llvm.ppc.qpx.qvstfd(<4 x double> %d, i8* %hv)
123
124   %v0 = load <4 x double>, <4 x double>* %h, align 8
125   ret <4 x double> %v0
126
127 ; CHECK-LABEL: @test2l
128 ; CHECK: @llvm.ppc.qpx.qvstfd
129 ; CHECK: ret <4 x double>
130 }
131
132 define <4 x double> @test2ln(<4 x double>* align 16 %h, <4 x double> %d) #0 {
133 entry:
134   %h1 = getelementptr <4 x double>, <4 x double>* %h, i64 1
135   %hv = bitcast <4 x double>* %h1 to i8*
136   call void @llvm.ppc.qpx.qvstfd(<4 x double> %d, i8* %hv)
137
138   %v0 = load <4 x double>, <4 x double>* %h, align 8
139   ret <4 x double> %v0
140
141 ; CHECK-LABEL: @test2ln
142 ; CHECK: @llvm.ppc.qpx.qvstfd
143 ; CHECK: ret <4 x double>
144 }
145
146 define <4 x double> @test2la(<4 x double>* align 32 %h, <4 x double> %d) #0 {
147 entry:
148   %h1 = getelementptr <4 x double>, <4 x double>* %h, i64 1
149   %hv = bitcast <4 x double>* %h1 to i8*
150   call void @llvm.ppc.qpx.qvstfd(<4 x double> %d, i8* %hv)
151
152   %v0 = load <4 x double>, <4 x double>* %h, align 8
153   ret <4 x double> %v0
154
155 ; CHECK-LABEL: @test2l
156 ; CHECK-NOT: @llvm.ppc.qpx.qvstfd
157 ; CHECK: ret <4 x double>
158 }
159
160 attributes #0 = { nounwind }
161 attributes #1 = { nounwind readonly }
162