1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -instsimplify -S | FileCheck %s
3
4;-----------------------------------------------------------------------------
5; Simple test using scalar layout.
6;-----------------------------------------------------------------------------
7
8declare i32 @llvm.smul.fix.sat.i32(i32, i32, i32)
9
10define i32 @test_smul_fix_sat_i32_0() {
11; CHECK-LABEL: @test_smul_fix_sat_i32_0(
12; CHECK-NEXT:    ret i32 536870912
13;
14  %r = call i32 @llvm.smul.fix.sat.i32(i32 1073741824, i32 1073741824, i32 31) ; 0.5 * 0.5
15  ret i32 %r
16}
17
18;-----------------------------------------------------------------------------
19; More extensive tests based on vectors (basically using the scalar fold
20; for each index).
21;-----------------------------------------------------------------------------
22
23declare <8 x i3> @llvm.smul.fix.sat.v8i3(<8 x i3>, <8 x i3>, i32)
24
25define <8 x i3> @test_smul_fix_sat_v8i3_0() {
26; CHECK-LABEL: @test_smul_fix_sat_v8i3_0(
27; CHECK-NEXT:    ret <8 x i3> <i3 3, i3 3, i3 3, i3 3, i3 0, i3 -4, i3 -4, i3 -4>
28;
29  %r = call <8 x i3> @llvm.smul.fix.sat.v8i3(
30  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
31  <8 x i3> <i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4>,
32  i32 0)
33  ret <8 x i3> %r
34}
35
36define <8 x i3> @test_smul_fix_sat_v8i3_1() {
37; CHECK-LABEL: @test_smul_fix_sat_v8i3_1(
38; CHECK-NEXT:    ret <8 x i3> <i3 3, i3 3, i3 3, i3 2, i3 0, i3 -2, i3 -4, i3 -4>
39;
40  %r = call <8 x i3> @llvm.smul.fix.sat.v8i3(
41  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
42  <8 x i3> <i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4>,
43  i32 1)
44  ret <8 x i3> %r
45}
46
47define <8 x i3> @test_smul_fix_sat_v8i3_2() {
48; CHECK-LABEL: @test_smul_fix_sat_v8i3_2(
49; CHECK-NEXT:    ret <8 x i3> <i3 3, i3 3, i3 2, i3 1, i3 0, i3 -1, i3 -2, i3 -3>
50;
51  %r = call <8 x i3> @llvm.smul.fix.sat.v8i3(
52  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
53  <8 x i3> <i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4>,
54  i32 2)
55  ret <8 x i3> %r
56}
57
58define <8 x i3> @test_smul_fix_sat_v8i3_3() {
59; CHECK-LABEL: @test_smul_fix_sat_v8i3_3(
60; CHECK-NEXT:    ret <8 x i3> <i3 3, i3 3, i3 2, i3 1, i3 0, i3 -1, i3 -2, i3 -3>
61;
62  %r = call <8 x i3> @llvm.smul.fix.sat.v8i3(
63  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
64  <8 x i3> <i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1>,
65  i32 0)
66  ret <8 x i3> %r
67}
68
69define <8 x i3> @test_smul_fix_sat_v8i3_4() {
70; CHECK-LABEL: @test_smul_fix_sat_v8i3_4(
71; CHECK-NEXT:    ret <8 x i3> <i3 2, i3 1, i3 1, i3 0, i3 0, i3 -1, i3 -1, i3 -2>
72;
73  %r = call <8 x i3> @llvm.smul.fix.sat.v8i3(
74  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
75  <8 x i3> <i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1>,
76  i32 1)
77  ret <8 x i3> %r
78}
79
80define <8 x i3> @test_smul_fix_sat_v8i3_5() {
81; CHECK-LABEL: @test_smul_fix_sat_v8i3_5(
82; CHECK-NEXT:    ret <8 x i3> <i3 1, i3 0, i3 0, i3 0, i3 0, i3 -1, i3 -1, i3 -1>
83;
84  %r = call <8 x i3> @llvm.smul.fix.sat.v8i3(
85  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
86  <8 x i3> <i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1>,
87  i32 2)
88  ret <8 x i3> %r
89}
90
91define <8 x i3> @test_smul_fix_sat_v8i3_6() {
92; CHECK-LABEL: @test_smul_fix_sat_v8i3_6(
93; CHECK-NEXT:    ret <8 x i3> <i3 -4, i3 -4, i3 -4, i3 -3, i3 0, i3 3, i3 3, i3 3>
94;
95  %r = call <8 x i3> @llvm.smul.fix.sat.v8i3(
96  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
97  <8 x i3> <i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3>,
98  i32 0)
99  ret <8 x i3> %r
100}
101
102define <8 x i3> @test_smul_fix_sat_v8i3_7() {
103; CHECK-LABEL: @test_smul_fix_sat_v8i3_7(
104; CHECK-NEXT:    ret <8 x i3> <i3 -4, i3 -4, i3 -3, i3 -2, i3 0, i3 1, i3 3, i3 3>
105;
106  %r = call <8 x i3> @llvm.smul.fix.sat.v8i3(
107  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
108  <8 x i3> <i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3>,
109  i32 1)
110  ret <8 x i3> %r
111}
112
113define <8 x i3> @test_smul_fix_sat_v8i3_8() {
114; CHECK-LABEL: @test_smul_fix_sat_v8i3_8(
115; CHECK-NEXT:    ret <8 x i3> <i3 -3, i3 -3, i3 -2, i3 -1, i3 0, i3 0, i3 1, i3 2>
116;
117  %r = call <8 x i3> @llvm.smul.fix.sat.v8i3(
118  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
119  <8 x i3> <i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3>,
120  i32 2)
121  ret <8 x i3> %r
122}
123