Skip to content

Commit 204a2ff

Browse files
committed
[SCCP] add tests for ashr range transforms; NFC
1 parent fda44be commit 204a2ff

File tree

1 file changed

+108
-0
lines changed

1 file changed

+108
-0
lines changed

llvm/test/Transforms/SCCP/ashr.ll

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -passes=ipsccp -S < %s | FileCheck %s
3+
4+
define i8 @ashr_and(i8 %x) {
5+
; CHECK-LABEL: @ashr_and(
6+
; CHECK-NEXT: [[PX:%.*]] = and i8 [[X:%.*]], 127
7+
; CHECK-NEXT: [[R:%.*]] = ashr i8 [[PX]], 1
8+
; CHECK-NEXT: ret i8 [[R]]
9+
;
10+
%px = and i8 %x, 127
11+
%r = ashr i8 %px, 1
12+
ret i8 %r
13+
}
14+
15+
define i8 @ashr_const(i8 %x) {
16+
; CHECK-LABEL: @ashr_const(
17+
; CHECK-NEXT: [[R:%.*]] = ashr i8 42, [[X:%.*]]
18+
; CHECK-NEXT: ret i8 [[R]]
19+
;
20+
%r = ashr i8 42, %x
21+
ret i8 %r
22+
}
23+
24+
define i8 @ashr_zext(i7 %x, i8 %y) {
25+
; CHECK-LABEL: @ashr_zext(
26+
; CHECK-NEXT: [[PX:%.*]] = zext i7 [[X:%.*]] to i8
27+
; CHECK-NEXT: [[R:%.*]] = ashr i8 [[PX]], [[Y:%.*]]
28+
; CHECK-NEXT: ret i8 [[R]]
29+
;
30+
%px = zext i7 %x to i8
31+
%r = ashr i8 %px, %y
32+
ret i8 %r
33+
}
34+
35+
define i8 @ashr_not_nonneg(i7 %x, i8 %y) {
36+
; CHECK-LABEL: @ashr_not_nonneg(
37+
; CHECK-NEXT: [[PX:%.*]] = sext i7 [[X:%.*]] to i8
38+
; CHECK-NEXT: [[R:%.*]] = ashr i8 [[PX]], [[Y:%.*]]
39+
; CHECK-NEXT: ret i8 [[R]]
40+
;
41+
%px = sext i7 %x to i8
42+
%r = ashr i8 %px, %y
43+
ret i8 %r
44+
}
45+
46+
; x is known non-negative in t block
47+
48+
define i32 @dominating_condition(i32 %x) {
49+
; CHECK-LABEL: @dominating_condition(
50+
; CHECK-NEXT: entry:
51+
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[X:%.*]], 0
52+
; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
53+
; CHECK: t:
54+
; CHECK-NEXT: [[A:%.*]] = ashr i32 [[X]], 16
55+
; CHECK-NEXT: br label [[EXIT:%.*]]
56+
; CHECK: f:
57+
; CHECK-NEXT: br label [[EXIT]]
58+
; CHECK: exit:
59+
; CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[A]], [[T]] ], [ 42, [[F]] ]
60+
; CHECK-NEXT: ret i32 [[COND]]
61+
;
62+
entry:
63+
%cmp = icmp sge i32 %x, 0
64+
br i1 %cmp, label %t, label %f
65+
66+
t:
67+
%a = ashr i32 %x, 16
68+
br label %exit
69+
70+
f:
71+
br label %exit
72+
73+
exit:
74+
%cond = phi i32 [ %a, %t ], [ 42, %f ]
75+
ret i32 %cond
76+
}
77+
78+
; x is known non-negative in f block
79+
80+
define i32 @dominating_condition_alt(i32 %x, i32 %y) {
81+
; CHECK-LABEL: @dominating_condition_alt(
82+
; CHECK-NEXT: entry:
83+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[X:%.*]], 2000000000
84+
; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
85+
; CHECK: t:
86+
; CHECK-NEXT: br label [[EXIT:%.*]]
87+
; CHECK: f:
88+
; CHECK-NEXT: [[A:%.*]] = ashr i32 [[X]], [[Y:%.*]]
89+
; CHECK-NEXT: br label [[EXIT]]
90+
; CHECK: exit:
91+
; CHECK-NEXT: [[COND:%.*]] = phi i32 [ -42, [[T]] ], [ [[A]], [[F]] ]
92+
; CHECK-NEXT: ret i32 [[COND]]
93+
;
94+
entry:
95+
%cmp = icmp ugt i32 %x, 2000000000
96+
br i1 %cmp, label %t, label %f
97+
98+
t:
99+
br label %exit
100+
101+
f:
102+
%a = ashr i32 %x, %y
103+
br label %exit
104+
105+
exit:
106+
%cond = phi i32 [ -42, %t ], [ %a, %f ]
107+
ret i32 %cond
108+
}

0 commit comments

Comments
 (0)