xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/2012-04-23-Neon-Intrinsics.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -instcombine < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @mulByZero(<4 x i16> %x) nounwind readnone ssp {
4*9880d681SAndroid Build Coastguard Workerentry:
5*9880d681SAndroid Build Coastguard Worker  %a = tail call <4 x i32> @llvm.arm.neon.vmulls.v4i32(<4 x i16> %x, <4 x i16> zeroinitializer) nounwind
6*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %a
7*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> zeroinitializer
9*9880d681SAndroid Build Coastguard Worker}
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @mulByOne(<4 x i16> %x) nounwind readnone ssp {
12*9880d681SAndroid Build Coastguard Workerentry:
13*9880d681SAndroid Build Coastguard Worker  %a = tail call <4 x i32> @llvm.arm.neon.vmulls.v4i32(<4 x i16> %x, <4 x i16> <i16 1, i16 1, i16 1, i16 1>) nounwind
14*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %a
15*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %a = sext <4 x i16> %x to <4 x i32>
17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> %a
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @constantMul() nounwind readnone ssp {
21*9880d681SAndroid Build Coastguard Workerentry:
22*9880d681SAndroid Build Coastguard Worker  %a = tail call <4 x i32> @llvm.arm.neon.vmulls.v4i32(<4 x i16> <i16 3, i16 3, i16 3, i16 3>, <4 x i16> <i16 2, i16 2, i16 2, i16 2>) nounwind
23*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %a
24*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> <i32 6, i32 6, i32 6, i32 6>
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @constantMulS() nounwind readnone ssp {
29*9880d681SAndroid Build Coastguard Workerentry:
30*9880d681SAndroid Build Coastguard Worker  %b = tail call <4 x i32> @llvm.arm.neon.vmulls.v4i32(<4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>, <4 x i16> <i16 1, i16 1, i16 1, i16 1>) nounwind
31*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %b
32*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @constantMulU() nounwind readnone ssp {
37*9880d681SAndroid Build Coastguard Workerentry:
38*9880d681SAndroid Build Coastguard Worker  %b = tail call <4 x i32> @llvm.arm.neon.vmullu.v4i32(<4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>, <4 x i16> <i16 1, i16 1, i16 1, i16 1>) nounwind
39*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %b
40*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
42*9880d681SAndroid Build Coastguard Worker}
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @complex1(<4 x i16> %x) nounwind readnone ssp {
45*9880d681SAndroid Build Coastguard Workerentry:
46*9880d681SAndroid Build Coastguard Worker  %a = tail call <4 x i32> @llvm.arm.neon.vmulls.v4i32(<4 x i16> <i16 2, i16 2, i16 2, i16 2>, <4 x i16> %x) nounwind
47*9880d681SAndroid Build Coastguard Worker  %b = add <4 x i32> zeroinitializer, %a
48*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %b
49*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %a = tail call <4 x i32> @llvm.arm.neon.vmulls.v4i32(<4 x i16> <i16 2, i16 2, i16 2, i16 2>, <4 x i16> %x) [[NUW:#[0-9]+]]
51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> %a
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @complex2(<4 x i32> %x) nounwind readnone ssp {
55*9880d681SAndroid Build Coastguard Workerentry:
56*9880d681SAndroid Build Coastguard Worker  %a = tail call <4 x i32> @llvm.arm.neon.vmulls.v4i32(<4 x i16> <i16 3, i16 3, i16 3, i16 3>, <4 x i16> <i16 2, i16 2, i16 2, i16 2>) nounwind
57*9880d681SAndroid Build Coastguard Worker  %b = add <4 x i32> %x, %a
58*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %b
59*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %b = add <4 x i32> %x, <i32 6, i32 6, i32 6, i32 6>
61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> %b
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.arm.neon.vmulls.v4i32(<4 x i16>, <4 x i16>) nounwind readnone
65*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.arm.neon.vmullu.v4i32(<4 x i16>, <4 x i16>) nounwind readnone
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker; ARM64 variants - <rdar://problem/12349617>
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @mulByZeroARM64(<4 x i16> %x) nounwind readnone ssp {
70*9880d681SAndroid Build Coastguard Workerentry:
71*9880d681SAndroid Build Coastguard Worker  %a = tail call <4 x i32> @llvm.aarch64.neon.smull.v4i32(<4 x i16> %x, <4 x i16> zeroinitializer) nounwind
72*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %a
73*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> zeroinitializer
75*9880d681SAndroid Build Coastguard Worker}
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @mulByOneARM64(<4 x i16> %x) nounwind readnone ssp {
78*9880d681SAndroid Build Coastguard Workerentry:
79*9880d681SAndroid Build Coastguard Worker  %a = tail call <4 x i32> @llvm.aarch64.neon.smull.v4i32(<4 x i16> %x, <4 x i16> <i16 1, i16 1, i16 1, i16 1>) nounwind
80*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %a
81*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %a = sext <4 x i16> %x to <4 x i32>
83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> %a
84*9880d681SAndroid Build Coastguard Worker}
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @constantMulARM64() nounwind readnone ssp {
87*9880d681SAndroid Build Coastguard Workerentry:
88*9880d681SAndroid Build Coastguard Worker  %a = tail call <4 x i32> @llvm.aarch64.neon.smull.v4i32(<4 x i16> <i16 3, i16 3, i16 3, i16 3>, <4 x i16> <i16 2, i16 2, i16 2, i16 2>) nounwind
89*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %a
90*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> <i32 6, i32 6, i32 6, i32 6>
92*9880d681SAndroid Build Coastguard Worker}
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @constantMulSARM64() nounwind readnone ssp {
95*9880d681SAndroid Build Coastguard Workerentry:
96*9880d681SAndroid Build Coastguard Worker  %b = tail call <4 x i32> @llvm.aarch64.neon.smull.v4i32(<4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>, <4 x i16> <i16 1, i16 1, i16 1, i16 1>) nounwind
97*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %b
98*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @constantMulUARM64() nounwind readnone ssp {
103*9880d681SAndroid Build Coastguard Workerentry:
104*9880d681SAndroid Build Coastguard Worker  %b = tail call <4 x i32> @llvm.aarch64.neon.umull.v4i32(<4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>, <4 x i16> <i16 1, i16 1, i16 1, i16 1>) nounwind
105*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %b
106*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @complex1ARM64(<4 x i16> %x) nounwind readnone ssp {
111*9880d681SAndroid Build Coastguard Workerentry:
112*9880d681SAndroid Build Coastguard Worker  %a = tail call <4 x i32> @llvm.aarch64.neon.smull.v4i32(<4 x i16> <i16 2, i16 2, i16 2, i16 2>, <4 x i16> %x) nounwind
113*9880d681SAndroid Build Coastguard Worker  %b = add <4 x i32> zeroinitializer, %a
114*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %b
115*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %a = tail call <4 x i32> @llvm.aarch64.neon.smull.v4i32(<4 x i16> <i16 2, i16 2, i16 2, i16 2>, <4 x i16> %x) [[NUW:#[0-9]+]]
117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> %a
118*9880d681SAndroid Build Coastguard Worker}
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @complex2ARM64(<4 x i32> %x) nounwind readnone ssp {
121*9880d681SAndroid Build Coastguard Workerentry:
122*9880d681SAndroid Build Coastguard Worker  %a = tail call <4 x i32> @llvm.aarch64.neon.smull.v4i32(<4 x i16> <i16 3, i16 3, i16 3, i16 3>, <4 x i16> <i16 2, i16 2, i16 2, i16 2>) nounwind
123*9880d681SAndroid Build Coastguard Worker  %b = add <4 x i32> %x, %a
124*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %b
125*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %b = add <4 x i32> %x, <i32 6, i32 6, i32 6, i32 6>
127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> %b
128*9880d681SAndroid Build Coastguard Worker}
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.neon.smull.v4i32(<4 x i16>, <4 x i16>) nounwind readnone
131*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.aarch64.neon.umull.v4i32(<4 x i16>, <4 x i16>) nounwind readnone
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker; CHECK: attributes #0 = { nounwind readnone ssp }
134*9880d681SAndroid Build Coastguard Worker; CHECK: attributes #1 = { nounwind readnone }
135*9880d681SAndroid Build Coastguard Worker; CHECK: attributes [[NUW]] = { nounwind }
136