xref: /llvm-project/llvm/test/Transforms/SCCP/ashr.ll (revision aafaa2f4fc52a132321e02683ea0d8f7ec190490)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=ipsccp -S < %s | FileCheck %s
3
4define i8 @ashr_and(i8 %x) {
5; CHECK-LABEL: @ashr_and(
6; CHECK-NEXT:    [[PX:%.*]] = and i8 [[X:%.*]], 127
7; CHECK-NEXT:    [[R:%.*]] = lshr 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
15define i8 @ashr_const(i8 %x) {
16; CHECK-LABEL: @ashr_const(
17; CHECK-NEXT:    [[R:%.*]] = lshr i8 42, [[X:%.*]]
18; CHECK-NEXT:    ret i8 [[R]]
19;
20  %r = ashr i8 42, %x
21  ret i8 %r
22}
23
24define 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:%.*]] = lshr 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; negative test
36
37define i8 @ashr_not_nonneg(i7 %x, i8 %y) {
38; CHECK-LABEL: @ashr_not_nonneg(
39; CHECK-NEXT:    [[PX:%.*]] = sext i7 [[X:%.*]] to i8
40; CHECK-NEXT:    [[R:%.*]] = ashr i8 [[PX]], [[Y:%.*]]
41; CHECK-NEXT:    ret i8 [[R]]
42;
43  %px = sext i7 %x to i8
44  %r = ashr i8 %px, %y
45  ret i8 %r
46}
47
48; x is known non-negative in t block
49
50define i32 @dominating_condition(i32 %x) {
51; CHECK-LABEL: @dominating_condition(
52; CHECK-NEXT:  entry:
53; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i32 [[X:%.*]], 0
54; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
55; CHECK:       t:
56; CHECK-NEXT:    [[A:%.*]] = lshr i32 [[X]], 16
57; CHECK-NEXT:    br label [[EXIT:%.*]]
58; CHECK:       f:
59; CHECK-NEXT:    br label [[EXIT]]
60; CHECK:       exit:
61; CHECK-NEXT:    [[COND:%.*]] = phi i32 [ [[A]], [[T]] ], [ 42, [[F]] ]
62; CHECK-NEXT:    ret i32 [[COND]]
63;
64entry:
65  %cmp = icmp sge i32 %x, 0
66  br i1 %cmp, label %t, label %f
67
68t:
69  %a = ashr i32 %x, 16
70  br label %exit
71
72f:
73  br label %exit
74
75exit:
76  %cond = phi i32 [ %a, %t ], [ 42, %f ]
77  ret i32 %cond
78}
79
80; x is known non-negative in f block
81
82define i32 @dominating_condition_alt(i32 %x, i32 %y) {
83; CHECK-LABEL: @dominating_condition_alt(
84; CHECK-NEXT:  entry:
85; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 [[X:%.*]], 2000000000
86; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
87; CHECK:       t:
88; CHECK-NEXT:    br label [[EXIT:%.*]]
89; CHECK:       f:
90; CHECK-NEXT:    [[A:%.*]] = lshr i32 [[X]], [[Y:%.*]]
91; CHECK-NEXT:    br label [[EXIT]]
92; CHECK:       exit:
93; CHECK-NEXT:    [[COND:%.*]] = phi i32 [ -42, [[T]] ], [ [[A]], [[F]] ]
94; CHECK-NEXT:    ret i32 [[COND]]
95;
96entry:
97  %cmp = icmp ugt i32 %x, 2000000000
98  br i1 %cmp, label %t, label %f
99
100t:
101  br label %exit
102
103f:
104  %a = ashr i32 %x, %y
105  br label %exit
106
107exit:
108  %cond = phi i32 [ -42, %t ], [ %a, %f ]
109  ret i32 %cond
110}
111