xref: /llvm-project/llvm/test/Transforms/InstSimplify/ConstProp/smul-fix.ll (revision b280ee1dd7e9b36ae7aaa3953556e4b7a7f31a29)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
3
4;-----------------------------------------------------------------------------
5; Simple test using scalar layout.
6;-----------------------------------------------------------------------------
7
8declare i32 @llvm.smul.fix.i32(i32, i32, i32)
9
10define i32 @test_smul_fix_i32_0() {
11; CHECK-LABEL: @test_smul_fix_i32_0(
12; CHECK-NEXT:    ret i32 536870912
13;
14  %r = call i32 @llvm.smul.fix.i32(i32 1073741824, i32 1073741824, i32 31) ; 0.5 * 0.5
15  ret i32 %r
16}
17
18define i32 @test_smul_fix_i32_undef_x() {
19; CHECK-LABEL: @test_smul_fix_i32_undef_x(
20; CHECK-NEXT:    ret i32 0
21;
22  %r = call i32 @llvm.smul.fix.i32(i32 undef, i32 1073741824, i32 31) ; undef * 0.5
23  ret i32 %r
24}
25
26define i32 @test_smul_fix_i32_x_undef() {
27; CHECK-LABEL: @test_smul_fix_i32_x_undef(
28; CHECK-NEXT:    ret i32 0
29;
30  %r = call i32 @llvm.smul.fix.i32(i32 1073741824, i32 undef, i32 31)
31  ret i32 %r
32}
33
34
35;-----------------------------------------------------------------------------
36; More extensive tests based on vectors (basically using the scalar fold
37; for each index).
38;-----------------------------------------------------------------------------
39
40declare <8 x i3> @llvm.smul.fix.v8i3(<8 x i3>, <8 x i3>, i32)
41
42define <8 x i3> @test_smul_fix_v8i3_0() {
43; CHECK-LABEL: @test_smul_fix_v8i3_0(
44; CHECK-NEXT:    ret <8 x i3> <i3 0, i3 -4, i3 0, i3 -4, i3 0, i3 -4, i3 0, i3 -4>
45;
46  %r = call <8 x i3> @llvm.smul.fix.v8i3(
47  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
48  <8 x i3> <i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4>,
49  i32 0)
50  ret <8 x i3> %r
51}
52
53define <8 x i3> @test_smul_fix_v8i3_1() {
54; CHECK-LABEL: @test_smul_fix_v8i3_1(
55; CHECK-NEXT:    ret <8 x i3> <i3 0, i3 -2, i3 -4, i3 2, i3 0, i3 -2, i3 -4, i3 2>
56;
57  %r = call <8 x i3> @llvm.smul.fix.v8i3(
58  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
59  <8 x i3> <i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4>,
60  i32 1)
61  ret <8 x i3> %r
62}
63
64define <8 x i3> @test_smul_fix_v8i3_2() {
65; CHECK-LABEL: @test_smul_fix_v8i3_2(
66; CHECK-NEXT:    ret <8 x i3> <i3 -4, i3 3, i3 2, i3 1, i3 0, i3 -1, i3 -2, i3 -3>
67;
68  %r = call <8 x i3> @llvm.smul.fix.v8i3(
69  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
70  <8 x i3> <i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4>,
71  i32 2)
72  ret <8 x i3> %r
73}
74
75define <8 x i3> @test_smul_fix_v8i3_3() {
76; CHECK-LABEL: @test_smul_fix_v8i3_3(
77; CHECK-NEXT:    ret <8 x i3> <i3 -4, i3 3, i3 2, i3 1, i3 0, i3 -1, i3 -2, i3 -3>
78;
79  %r = call <8 x i3> @llvm.smul.fix.v8i3(
80  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
81  <8 x i3> <i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1>,
82  i32 0)
83  ret <8 x i3> %r
84}
85
86define <8 x i3> @test_smul_fix_v8i3_4() {
87; CHECK-LABEL: @test_smul_fix_v8i3_4(
88; CHECK-NEXT:    ret <8 x i3> <i3 2, i3 1, i3 1, i3 0, i3 0, i3 -1, i3 -1, i3 -2>
89;
90  %r = call <8 x i3> @llvm.smul.fix.v8i3(
91  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
92  <8 x i3> <i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1>,
93  i32 1)
94  ret <8 x i3> %r
95}
96
97define <8 x i3> @test_smul_fix_v8i3_5() {
98; CHECK-LABEL: @test_smul_fix_v8i3_5(
99; CHECK-NEXT:    ret <8 x i3> <i3 1, i3 0, i3 0, i3 0, i3 0, i3 -1, i3 -1, i3 -1>
100;
101  %r = call <8 x i3> @llvm.smul.fix.v8i3(
102  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
103  <8 x i3> <i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1>,
104  i32 2)
105  ret <8 x i3> %r
106}
107
108define <8 x i3> @test_smul_fix_v8i3_6() {
109; CHECK-LABEL: @test_smul_fix_v8i3_6(
110; CHECK-NEXT:    ret <8 x i3> <i3 -4, i3 -1, i3 2, i3 -3, i3 0, i3 3, i3 -2, i3 1>
111;
112  %r = call <8 x i3> @llvm.smul.fix.v8i3(
113  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
114  <8 x i3> <i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3>,
115  i32 0)
116  ret <8 x i3> %r
117}
118
119define <8 x i3> @test_smul_fix_v8i3_7() {
120; CHECK-LABEL: @test_smul_fix_v8i3_7(
121; CHECK-NEXT:    ret <8 x i3> <i3 2, i3 3, i3 -3, i3 -2, i3 0, i3 1, i3 3, i3 -4>
122;
123  %r = call <8 x i3> @llvm.smul.fix.v8i3(
124  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
125  <8 x i3> <i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3>,
126  i32 1)
127  ret <8 x i3> %r
128}
129
130define <8 x i3> @test_smul_fix_v8i3_8() {
131; CHECK-LABEL: @test_smul_fix_v8i3_8(
132; CHECK-NEXT:    ret <8 x i3> <i3 -3, i3 -3, i3 -2, i3 -1, i3 0, i3 0, i3 1, i3 2>
133;
134  %r = call <8 x i3> @llvm.smul.fix.v8i3(
135  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
136  <8 x i3> <i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3>,
137  i32 2)
138  ret <8 x i3> %r
139}
140
141define <8 x i3> @test_smul_fix_v8i3_9() {
142; CHECK-LABEL: @test_smul_fix_v8i3_9(
143; CHECK-NEXT:    ret <8 x i3> <i3 0, i3 0, i3 poison, i3 poison, i3 1, i3 1, i3 1, i3 1>
144;
145  %r = call <8 x i3> @llvm.smul.fix.v8i3(
146  <8 x i3> <i3 2, i3 undef, i3 2, i3 poison, i3 2, i3 2, i3 2, i3 2>,
147  <8 x i3> <i3 undef, i3 2, i3 poison, i3 2, i3 2, i3 2, i3 2, i3 2>,
148  i32 2)
149  ret <8 x i3> %r
150}
151