0f2065e01eacaa67902aae02943bbe23e4006f38
[platform/upstream/llvm.git] /
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instcombine -S | FileCheck %s
3
4 ; https://bugs.llvm.org/show_bug.cgi?id=38708
5
6 ; Pattern:
7 ;   (1 << bits) u<= val
8 ; Should be transformed into:
9 ;   (val l>> bits) != 0
10
11 ; ============================================================================ ;
12 ; Basic positive tests
13 ; ============================================================================ ;
14
15 define i1 @p0(i8 %val, i8 %bits) {
16 ; CHECK-LABEL: @p0(
17 ; CHECK-NEXT:    [[T0:%.*]] = shl i8 1, [[BITS:%.*]]
18 ; CHECK-NEXT:    [[R:%.*]] = icmp ule i8 [[T0]], [[VAL:%.*]]
19 ; CHECK-NEXT:    ret i1 [[R]]
20 ;
21   %t0 = shl i8 1, %bits
22   %r = icmp ule i8 %t0, %val
23   ret i1 %r
24 }
25
26 ; ============================================================================ ;
27 ; Vector tests
28 ; ============================================================================ ;
29
30 define <2 x i1> @p1_vec(<2 x i8> %val, <2 x i8> %bits) {
31 ; CHECK-LABEL: @p1_vec(
32 ; CHECK-NEXT:    [[T0:%.*]] = shl <2 x i8> <i8 1, i8 1>, [[BITS:%.*]]
33 ; CHECK-NEXT:    [[R:%.*]] = icmp ule <2 x i8> [[T0]], [[VAL:%.*]]
34 ; CHECK-NEXT:    ret <2 x i1> [[R]]
35 ;
36   %t0 = shl <2 x i8> <i8 1, i8 1>, %bits
37   %r = icmp ule <2 x i8> %t0, %val
38   ret <2 x i1> %r
39 }
40
41 define <3 x i1> @p2_vec_undef(<3 x i8> %val, <3 x i8> %bits) {
42 ; CHECK-LABEL: @p2_vec_undef(
43 ; CHECK-NEXT:    [[T0:%.*]] = shl <3 x i8> <i8 1, i8 undef, i8 1>, [[BITS:%.*]]
44 ; CHECK-NEXT:    [[R:%.*]] = icmp ule <3 x i8> [[T0]], [[VAL:%.*]]
45 ; CHECK-NEXT:    ret <3 x i1> [[R]]
46 ;
47   %t0 = shl <3 x i8> <i8 1, i8 undef, i8 1>, %bits
48   %r = icmp ule <3 x i8> %t0, %val
49   ret <3 x i1> %r
50 }
51
52 ; ============================================================================ ;
53 ; Commutativity tests.
54 ; ============================================================================ ;
55
56 declare i8 @gen8()
57
58 define i1 @c0(i8 %bits) {
59 ; CHECK-LABEL: @c0(
60 ; CHECK-NEXT:    [[T0:%.*]] = shl i8 1, [[BITS:%.*]]
61 ; CHECK-NEXT:    [[VAL:%.*]] = call i8 @gen8()
62 ; CHECK-NEXT:    [[R:%.*]] = icmp uge i8 [[VAL]], [[T0]]
63 ; CHECK-NEXT:    ret i1 [[R]]
64 ;
65   %t0 = shl i8 1, %bits
66   %val = call i8 @gen8()
67   %r = icmp uge i8 %val, %t0 ; swapped order and predicate
68   ret i1 %r
69 }
70
71 ; ============================================================================ ;
72 ; One-use tests.
73 ; ============================================================================ ;
74
75 declare void @use8(i8)
76
77 define i1 @oneuse0(i8 %val, i8 %bits) {
78 ; CHECK-LABEL: @oneuse0(
79 ; CHECK-NEXT:    [[T0:%.*]] = shl i8 1, [[BITS:%.*]]
80 ; CHECK-NEXT:    call void @use8(i8 [[T0]])
81 ; CHECK-NEXT:    [[R:%.*]] = icmp ule i8 [[T0]], [[VAL:%.*]]
82 ; CHECK-NEXT:    ret i1 [[R]]
83 ;
84   %t0 = shl i8 1, %bits
85   call void @use8(i8 %t0)
86   %r = icmp ule i8 %t0, %val
87   ret i1 %r
88 }
89
90 ; ============================================================================ ;
91 ; Negative tests
92 ; ============================================================================ ;
93
94 define i1 @n0(i8 %val, i8 %bits) {
95 ; CHECK-LABEL: @n0(
96 ; CHECK-NEXT:    [[T0:%.*]] = shl i8 2, [[BITS:%.*]]
97 ; CHECK-NEXT:    [[R:%.*]] = icmp ule i8 [[T0]], [[VAL:%.*]]
98 ; CHECK-NEXT:    ret i1 [[R]]
99 ;
100   %t0 = shl i8 2, %bits ; constant is not 1
101   %r = icmp ule i8 %t0, %val
102   ret i1 %r
103 }
104
105 define <2 x i1> @n1_vec_nonsplat(<2 x i8> %val, <2 x i8> %bits) {
106 ; CHECK-LABEL: @n1_vec_nonsplat(
107 ; CHECK-NEXT:    [[T0:%.*]] = shl <2 x i8> <i8 1, i8 2>, [[BITS:%.*]]
108 ; CHECK-NEXT:    [[R:%.*]] = icmp ule <2 x i8> [[T0]], [[VAL:%.*]]
109 ; CHECK-NEXT:    ret <2 x i1> [[R]]
110 ;
111   %t0 = shl <2 x i8> <i8 1, i8 2>, %bits ; again, wrong constant
112   %r = icmp ule <2 x i8> %t0, %val
113   ret <2 x i1> %r
114 }
115
116 define i1 @n2(i8 %val, i8 %bits) {
117 ; CHECK-LABEL: @n2(
118 ; CHECK-NEXT:    [[T0:%.*]] = shl i8 1, [[BITS:%.*]]
119 ; CHECK-NEXT:    [[R:%.*]] = icmp ult i8 [[T0]], [[VAL:%.*]]
120 ; CHECK-NEXT:    ret i1 [[R]]
121 ;
122   %t0 = shl i8 1, %bits
123   %r = icmp ult i8 %t0, %val ; wrong predicate
124   ret i1 %r
125 }
126
127 define i1 @n3(i8 %bits) {
128 ; CHECK-LABEL: @n3(
129 ; CHECK-NEXT:    [[T0:%.*]] = shl i8 1, [[BITS:%.*]]
130 ; CHECK-NEXT:    [[VAL:%.*]] = call i8 @gen8()
131 ; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[VAL]], [[T0]]
132 ; CHECK-NEXT:    ret i1 [[R]]
133 ;
134   %t0 = shl i8 1, %bits
135   %val = call i8 @gen8()
136   %r = icmp ugt i8 %val, %t0 ; swapped order and [wrong] predicate
137   ret i1 %r
138 }