[InstCombine] Signed saturation patterns
[llvm-core.git] / test / Analysis / ConstantFolding / smul-fix.ll
blob9fcf4a9d65c2810488e7784fa115273279f9a695
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -constprop -S | FileCheck %s
4 ;-----------------------------------------------------------------------------
5 ; Simple test using scalar layout.
6 ;-----------------------------------------------------------------------------
8 declare i32 @llvm.smul.fix.i32(i32, i32, i32)
10 define i32 @test_smul_fix_i32_0() {
11 ; CHECK-LABEL: @test_smul_fix_i32_0(
12 ; CHECK-NEXT:    ret i32 536870912
14   %r = call i32 @llvm.smul.fix.i32(i32 1073741824, i32 1073741824, i32 31) ; 0.5 * 0.5
15   ret i32 %r
18 ;-----------------------------------------------------------------------------
19 ; More extensive tests based on vectors (basically using the scalar fold
20 ; for each index).
21 ;-----------------------------------------------------------------------------
23 declare <8 x i3> @llvm.smul.fix.v8i3(<8 x i3>, <8 x i3>, i32)
25 define <8 x i3> @test_smul_fix_v8i3_0() {
26 ; CHECK-LABEL: @test_smul_fix_v8i3_0(
27 ; CHECK-NEXT:    ret <8 x i3> <i3 0, i3 -4, i3 0, i3 -4, i3 0, i3 -4, i3 0, i3 -4>
29   %r = call <8 x i3> @llvm.smul.fix.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
36 define <8 x i3> @test_smul_fix_v8i3_1() {
37 ; CHECK-LABEL: @test_smul_fix_v8i3_1(
38 ; CHECK-NEXT:    ret <8 x i3> <i3 0, i3 -2, i3 -4, i3 2, i3 0, i3 -2, i3 -4, i3 2>
40   %r = call <8 x i3> @llvm.smul.fix.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
47 define <8 x i3> @test_smul_fix_v8i3_2() {
48 ; CHECK-LABEL: @test_smul_fix_v8i3_2(
49 ; CHECK-NEXT:    ret <8 x i3> <i3 -4, i3 3, i3 2, i3 1, i3 0, i3 -1, i3 -2, i3 -3>
51   %r = call <8 x i3> @llvm.smul.fix.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
58 define <8 x i3> @test_smul_fix_v8i3_3() {
59 ; CHECK-LABEL: @test_smul_fix_v8i3_3(
60 ; CHECK-NEXT:    ret <8 x i3> <i3 -4, i3 3, i3 2, i3 1, i3 0, i3 -1, i3 -2, i3 -3>
62   %r = call <8 x i3> @llvm.smul.fix.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
69 define <8 x i3> @test_smul_fix_v8i3_4() {
70 ; CHECK-LABEL: @test_smul_fix_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>
73   %r = call <8 x i3> @llvm.smul.fix.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
80 define <8 x i3> @test_smul_fix_v8i3_5() {
81 ; CHECK-LABEL: @test_smul_fix_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>
84   %r = call <8 x i3> @llvm.smul.fix.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
91 define <8 x i3> @test_smul_fix_v8i3_6() {
92 ; CHECK-LABEL: @test_smul_fix_v8i3_6(
93 ; CHECK-NEXT:    ret <8 x i3> <i3 -4, i3 -1, i3 2, i3 -3, i3 0, i3 3, i3 -2, i3 1>
95   %r = call <8 x i3> @llvm.smul.fix.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
102 define <8 x i3> @test_smul_fix_v8i3_7() {
103 ; CHECK-LABEL: @test_smul_fix_v8i3_7(
104 ; CHECK-NEXT:    ret <8 x i3> <i3 2, i3 3, i3 -3, i3 -2, i3 0, i3 1, i3 3, i3 -4>
106   %r = call <8 x i3> @llvm.smul.fix.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
113 define <8 x i3> @test_smul_fix_v8i3_8() {
114 ; CHECK-LABEL: @test_smul_fix_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>
117   %r = call <8 x i3> @llvm.smul.fix.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