@@ -104,6 +104,92 @@ define <8 x i8> @abs(<8 x i8> %a) {
104104; CHECK-LABEL: @abs(
105105; CHECK-NEXT: [[AB:%.*]] = shufflevector <8 x i8> [[A:%.*]], <8 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
106106; CHECK-NEXT: [[AT:%.*]] = shufflevector <8 x i8> [[A]], <8 x i8> poison, <4 x i32> <i32 7, i32 6, i32 5, i32 4>
107+ ; CHECK-NEXT: [[ABT:%.*]] = call <4 x i8> @llvm.abs.v4i8(<4 x i8> [[AT]], i1 false)
108+ ; CHECK-NEXT: [[ABB:%.*]] = call <4 x i8> @llvm.abs.v4i8(<4 x i8> [[AB]], i1 false)
109+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x i8> [[ABT]], <4 x i8> [[ABB]], <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
110+ ; CHECK-NEXT: ret <8 x i8> [[R]]
111+ ;
112+ %ab = shufflevector <8 x i8 > %a , <8 x i8 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
113+ %at = shufflevector <8 x i8 > %a , <8 x i8 > poison, <4 x i32 > <i32 7 , i32 6 , i32 5 , i32 4 >
114+ %abt = call <4 x i8 > @llvm.abs.v4i8 (<4 x i8 > %at , i1 false )
115+ %abb = call <4 x i8 > @llvm.abs.v4i8 (<4 x i8 > %ab , i1 false )
116+ %r = shufflevector <4 x i8 > %abt , <4 x i8 > %abb , <8 x i32 > <i32 7 , i32 6 , i32 5 , i32 4 , i32 3 , i32 2 , i32 1 , i32 0 >
117+ ret <8 x i8 > %r
118+ }
119+
120+ define <8 x half > @powi (<8 x half > %a ) {
121+ ; CHECK-LABEL: @powi(
122+ ; CHECK-NEXT: [[AB:%.*]] = shufflevector <8 x half> [[A:%.*]], <8 x half> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
123+ ; CHECK-NEXT: [[AT:%.*]] = shufflevector <8 x half> [[A]], <8 x half> poison, <4 x i32> <i32 7, i32 6, i32 5, i32 4>
124+ ; CHECK-NEXT: [[ABT:%.*]] = call <4 x half> @llvm.powi.v4f16.i32(<4 x half> [[AT]], i32 10)
125+ ; CHECK-NEXT: [[ABB:%.*]] = call <4 x half> @llvm.powi.v4f16.i32(<4 x half> [[AB]], i32 10)
126+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x half> [[ABT]], <4 x half> [[ABB]], <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
127+ ; CHECK-NEXT: ret <8 x half> [[R]]
128+ ;
129+ %ab = shufflevector <8 x half > %a , <8 x half > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
130+ %at = shufflevector <8 x half > %a , <8 x half > poison, <4 x i32 > <i32 7 , i32 6 , i32 5 , i32 4 >
131+ %abt = call <4 x half > @llvm.powi.v4f16.i32 (<4 x half > %at , i32 10 )
132+ %abb = call <4 x half > @llvm.powi.v4f16.i32 (<4 x half > %ab , i32 10 )
133+ %r = shufflevector <4 x half > %abt , <4 x half > %abb , <8 x i32 > <i32 7 , i32 6 , i32 5 , i32 4 , i32 3 , i32 2 , i32 1 , i32 0 >
134+ ret <8 x half > %r
135+ }
136+
137+ ; Check that call instructions are treated separately from intrinsics.
138+ define <8 x half > @callinst (<8 x half > %a ) {
139+ ; CHECK-LABEL: @callinst(
140+ ; CHECK-NEXT: [[AB:%.*]] = shufflevector <8 x half> [[A:%.*]], <8 x half> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
141+ ; CHECK-NEXT: [[AT:%.*]] = shufflevector <8 x half> [[A]], <8 x half> poison, <4 x i32> <i32 7, i32 6, i32 5, i32 4>
142+ ; CHECK-NEXT: [[ABT:%.*]] = call <4 x half> @othercall(<4 x half> [[AT]])
143+ ; CHECK-NEXT: [[ABB:%.*]] = call <4 x half> @llvm.fabs.v4f16(<4 x half> [[AB]])
144+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x half> [[ABT]], <4 x half> [[ABB]], <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
145+ ; CHECK-NEXT: ret <8 x half> [[R]]
146+ ;
147+ %ab = shufflevector <8 x half > %a , <8 x half > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
148+ %at = shufflevector <8 x half > %a , <8 x half > poison, <4 x i32 > <i32 7 , i32 6 , i32 5 , i32 4 >
149+ %abt = call <4 x half > @othercall (<4 x half > %at )
150+ %abb = call <4 x half > @llvm.fabs.v4f16 (<4 x half > %ab )
151+ %r = shufflevector <4 x half > %abt , <4 x half > %abb , <8 x i32 > <i32 7 , i32 6 , i32 5 , i32 4 , i32 3 , i32 2 , i32 1 , i32 0 >
152+ ret <8 x half > %r
153+ }
154+ define <8 x half > @callinst2 (<8 x half > %a ) {
155+ ; CHECK-LABEL: @callinst2(
156+ ; CHECK-NEXT: [[AB:%.*]] = shufflevector <8 x half> [[A:%.*]], <8 x half> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
157+ ; CHECK-NEXT: [[AT:%.*]] = shufflevector <8 x half> [[A]], <8 x half> poison, <4 x i32> <i32 7, i32 6, i32 5, i32 4>
158+ ; CHECK-NEXT: [[ABT:%.*]] = call <4 x half> @llvm.fabs.v4f16(<4 x half> [[AT]])
159+ ; CHECK-NEXT: [[ABB:%.*]] = call <4 x half> @othercall(<4 x half> [[AB]])
160+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x half> [[ABT]], <4 x half> [[ABB]], <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
161+ ; CHECK-NEXT: ret <8 x half> [[R]]
162+ ;
163+ %ab = shufflevector <8 x half > %a , <8 x half > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
164+ %at = shufflevector <8 x half > %a , <8 x half > poison, <4 x i32 > <i32 7 , i32 6 , i32 5 , i32 4 >
165+ %abt = call <4 x half > @llvm.fabs.v4f16 (<4 x half > %at )
166+ %abb = call <4 x half > @othercall (<4 x half > %ab )
167+ %r = shufflevector <4 x half > %abt , <4 x half > %abb , <8 x i32 > <i32 7 , i32 6 , i32 5 , i32 4 , i32 3 , i32 2 , i32 1 , i32 0 >
168+ ret <8 x half > %r
169+ }
170+ declare <4 x half > @othercall (<4 x half >)
171+
172+ define <8 x i32 > @lrint (<8 x half > %a ) {
173+ ; CHECK-LABEL: @lrint(
174+ ; CHECK-NEXT: [[AB:%.*]] = shufflevector <8 x half> [[A:%.*]], <8 x half> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
175+ ; CHECK-NEXT: [[AT:%.*]] = shufflevector <8 x half> [[A]], <8 x half> poison, <4 x i32> <i32 7, i32 6, i32 5, i32 4>
176+ ; CHECK-NEXT: [[ABT:%.*]] = call <4 x i32> @llvm.lrint.v4i32.v4f16(<4 x half> [[AT]])
177+ ; CHECK-NEXT: [[ABB:%.*]] = call <4 x i32> @llvm.lrint.v4i32.v4f16(<4 x half> [[AB]])
178+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x i32> [[ABT]], <4 x i32> [[ABB]], <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
179+ ; CHECK-NEXT: ret <8 x i32> [[R]]
180+ ;
181+ %ab = shufflevector <8 x half > %a , <8 x half > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
182+ %at = shufflevector <8 x half > %a , <8 x half > poison, <4 x i32 > <i32 7 , i32 6 , i32 5 , i32 4 >
183+ %abt = call <4 x i32 > @llvm.lrint.v4i32.v4f16 (<4 x half > %at )
184+ %abb = call <4 x i32 > @llvm.lrint.v4i32.v4f16 (<4 x half > %ab )
185+ %r = shufflevector <4 x i32 > %abt , <4 x i32 > %abb , <8 x i32 > <i32 7 , i32 6 , i32 5 , i32 4 , i32 3 , i32 2 , i32 1 , i32 0 >
186+ ret <8 x i32 > %r
187+ }
188+
189+ define <8 x i8 > @abs_different (<8 x i8 > %a ) {
190+ ; CHECK-LABEL: @abs_different(
191+ ; CHECK-NEXT: [[AB:%.*]] = shufflevector <8 x i8> [[A:%.*]], <8 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
192+ ; CHECK-NEXT: [[AT:%.*]] = shufflevector <8 x i8> [[A]], <8 x i8> poison, <4 x i32> <i32 7, i32 6, i32 5, i32 4>
107193; CHECK-NEXT: [[ABT:%.*]] = call <4 x i8> @llvm.abs.v4i8(<4 x i8> [[AT]], i1 true)
108194; CHECK-NEXT: [[ABB:%.*]] = call <4 x i8> @llvm.abs.v4i8(<4 x i8> [[AB]], i1 false)
109195; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x i8> [[ABT]], <4 x i8> [[ABB]], <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
0 commit comments