[InstCombine] Signed saturation patterns
[llvm-core.git] / test / Transforms / InstCombine / high-bit-signmask.ll
blob4a1b395ca35f9b59517f2aac78c5f1e89442a2d2
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt %s -instcombine -S | FileCheck %s
4 define i64 @t0(i64 %x) {
5 ; CHECK-LABEL: @t0(
6 ; CHECK-NEXT:    [[R:%.*]] = ashr i64 [[X:%.*]], 63
7 ; CHECK-NEXT:    ret i64 [[R]]
9   %t0 = lshr i64 %x, 63
10   %r = sub i64 0, %t0
11   ret i64 %r
13 define i64 @t0_exact(i64 %x) {
14 ; CHECK-LABEL: @t0_exact(
15 ; CHECK-NEXT:    [[R:%.*]] = ashr exact i64 [[X:%.*]], 63
16 ; CHECK-NEXT:    ret i64 [[R]]
18   %t0 = lshr exact i64 %x, 63
19   %r = sub i64 0, %t0
20   ret i64 %r
22 define i64 @t2(i64 %x) {
23 ; CHECK-LABEL: @t2(
24 ; CHECK-NEXT:    [[R:%.*]] = lshr i64 [[X:%.*]], 63
25 ; CHECK-NEXT:    ret i64 [[R]]
27   %t0 = ashr i64 %x, 63
28   %r = sub i64 0, %t0
29   ret i64 %r
31 define i64 @t3_exact(i64 %x) {
32 ; CHECK-LABEL: @t3_exact(
33 ; CHECK-NEXT:    [[R:%.*]] = lshr exact i64 [[X:%.*]], 63
34 ; CHECK-NEXT:    ret i64 [[R]]
36   %t0 = ashr exact i64 %x, 63
37   %r = sub i64 0, %t0
38   ret i64 %r
41 define <2 x i64> @t4(<2 x i64> %x) {
42 ; CHECK-LABEL: @t4(
43 ; CHECK-NEXT:    [[R:%.*]] = ashr <2 x i64> [[X:%.*]], <i64 63, i64 63>
44 ; CHECK-NEXT:    ret <2 x i64> [[R]]
46   %t0 = lshr <2 x i64> %x, <i64 63, i64 63>
47   %r = sub <2 x i64> zeroinitializer, %t0
48   ret <2 x i64> %r
51 define <2 x i64> @t5(<2 x i64> %x) {
52 ; CHECK-LABEL: @t5(
53 ; CHECK-NEXT:    [[T0:%.*]] = lshr <2 x i64> [[X:%.*]], <i64 63, i64 undef>
54 ; CHECK-NEXT:    [[R:%.*]] = sub <2 x i64> <i64 0, i64 undef>, [[T0]]
55 ; CHECK-NEXT:    ret <2 x i64> [[R]]
57   %t0 = lshr <2 x i64> %x, <i64 63, i64 undef>
58   %r = sub <2 x i64> <i64 0, i64 undef>, %t0
59   ret <2 x i64> %r
62 declare void @use64(i64)
63 declare void @use32(i64)
65 define i64 @t6(i64 %x) {
66 ; CHECK-LABEL: @t6(
67 ; CHECK-NEXT:    [[T0:%.*]] = lshr i64 [[X:%.*]], 63
68 ; CHECK-NEXT:    call void @use64(i64 [[T0]])
69 ; CHECK-NEXT:    [[R:%.*]] = ashr i64 [[X]], 63
70 ; CHECK-NEXT:    ret i64 [[R]]
72   %t0 = lshr i64 %x, 63
73   call void @use64(i64 %t0)
74   %r = sub i64 0, %t0
75   ret i64 %r
78 define i64 @n7(i64 %x) {
79 ; CHECK-LABEL: @n7(
80 ; CHECK-NEXT:    [[T0:%.*]] = lshr i64 [[X:%.*]], 63
81 ; CHECK-NEXT:    call void @use32(i64 [[T0]])
82 ; CHECK-NEXT:    [[R:%.*]] = ashr i64 [[X]], 63
83 ; CHECK-NEXT:    ret i64 [[R]]
85   %t0 = lshr i64 %x, 63
86   call void @use32(i64 %t0)
87   %r = sub i64 0, %t0
88   ret i64 %r
91 define i64 @n8(i64 %x) {
92 ; CHECK-LABEL: @n8(
93 ; CHECK-NEXT:    [[T0:%.*]] = lshr i64 [[X:%.*]], 63
94 ; CHECK-NEXT:    call void @use64(i64 [[T0]])
95 ; CHECK-NEXT:    call void @use32(i64 [[T0]])
96 ; CHECK-NEXT:    [[R:%.*]] = ashr i64 [[X]], 63
97 ; CHECK-NEXT:    ret i64 [[R]]
99   %t0 = lshr i64 %x, 63
100   call void @use64(i64 %t0)
101   call void @use32(i64 %t0)
102   %r = sub i64 0, %t0
103   ret i64 %r
106 define i64 @n9(i64 %x) {
107 ; CHECK-LABEL: @n9(
108 ; CHECK-NEXT:    [[T0:%.*]] = lshr i64 [[X:%.*]], 62
109 ; CHECK-NEXT:    [[R:%.*]] = sub nsw i64 0, [[T0]]
110 ; CHECK-NEXT:    ret i64 [[R]]
112   %t0 = lshr i64 %x, 62
113   %r = sub i64 0, %t0
114   ret i64 %r
117 define i64 @n10(i64 %x) {
118 ; CHECK-LABEL: @n10(
119 ; CHECK-NEXT:    [[T0:%.*]] = lshr i64 [[X:%.*]], 63
120 ; CHECK-NEXT:    [[R:%.*]] = xor i64 [[T0]], 1
121 ; CHECK-NEXT:    ret i64 [[R]]
123   %t0 = lshr i64 %x, 63
124   %r = sub i64 1, %t0
125   ret i64 %r