xref: /llvm-project/llvm/test/Transforms/SCCP/ashr.ll (revision aafaa2f4fc52a132321e02683ea0d8f7ec190490)
1204a2fffSSanjay Patel; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2204a2fffSSanjay Patel; RUN: opt -passes=ipsccp -S < %s | FileCheck %s
3204a2fffSSanjay Patel
4204a2fffSSanjay Pateldefine i8 @ashr_and(i8 %x) {
5204a2fffSSanjay Patel; CHECK-LABEL: @ashr_and(
6204a2fffSSanjay Patel; CHECK-NEXT:    [[PX:%.*]] = and i8 [[X:%.*]], 127
7*aafaa2f4SSanjay Patel; CHECK-NEXT:    [[R:%.*]] = lshr i8 [[PX]], 1
8204a2fffSSanjay Patel; CHECK-NEXT:    ret i8 [[R]]
9204a2fffSSanjay Patel;
10204a2fffSSanjay Patel  %px = and i8 %x, 127
11204a2fffSSanjay Patel  %r = ashr i8 %px, 1
12204a2fffSSanjay Patel  ret i8 %r
13204a2fffSSanjay Patel}
14204a2fffSSanjay Patel
15204a2fffSSanjay Pateldefine i8 @ashr_const(i8 %x) {
16204a2fffSSanjay Patel; CHECK-LABEL: @ashr_const(
17*aafaa2f4SSanjay Patel; CHECK-NEXT:    [[R:%.*]] = lshr i8 42, [[X:%.*]]
18204a2fffSSanjay Patel; CHECK-NEXT:    ret i8 [[R]]
19204a2fffSSanjay Patel;
20204a2fffSSanjay Patel  %r = ashr i8 42, %x
21204a2fffSSanjay Patel  ret i8 %r
22204a2fffSSanjay Patel}
23204a2fffSSanjay Patel
24204a2fffSSanjay Pateldefine i8 @ashr_zext(i7 %x, i8 %y) {
25204a2fffSSanjay Patel; CHECK-LABEL: @ashr_zext(
26204a2fffSSanjay Patel; CHECK-NEXT:    [[PX:%.*]] = zext i7 [[X:%.*]] to i8
27*aafaa2f4SSanjay Patel; CHECK-NEXT:    [[R:%.*]] = lshr i8 [[PX]], [[Y:%.*]]
28204a2fffSSanjay Patel; CHECK-NEXT:    ret i8 [[R]]
29204a2fffSSanjay Patel;
30204a2fffSSanjay Patel  %px = zext i7 %x to i8
31204a2fffSSanjay Patel  %r = ashr i8 %px, %y
32204a2fffSSanjay Patel  ret i8 %r
33204a2fffSSanjay Patel}
34204a2fffSSanjay Patel
35*aafaa2f4SSanjay Patel; negative test
36*aafaa2f4SSanjay Patel
37204a2fffSSanjay Pateldefine i8 @ashr_not_nonneg(i7 %x, i8 %y) {
38204a2fffSSanjay Patel; CHECK-LABEL: @ashr_not_nonneg(
39204a2fffSSanjay Patel; CHECK-NEXT:    [[PX:%.*]] = sext i7 [[X:%.*]] to i8
40204a2fffSSanjay Patel; CHECK-NEXT:    [[R:%.*]] = ashr i8 [[PX]], [[Y:%.*]]
41204a2fffSSanjay Patel; CHECK-NEXT:    ret i8 [[R]]
42204a2fffSSanjay Patel;
43204a2fffSSanjay Patel  %px = sext i7 %x to i8
44204a2fffSSanjay Patel  %r = ashr i8 %px, %y
45204a2fffSSanjay Patel  ret i8 %r
46204a2fffSSanjay Patel}
47204a2fffSSanjay Patel
48204a2fffSSanjay Patel; x is known non-negative in t block
49204a2fffSSanjay Patel
50204a2fffSSanjay Pateldefine i32 @dominating_condition(i32 %x) {
51204a2fffSSanjay Patel; CHECK-LABEL: @dominating_condition(
52204a2fffSSanjay Patel; CHECK-NEXT:  entry:
53204a2fffSSanjay Patel; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i32 [[X:%.*]], 0
54204a2fffSSanjay Patel; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
55204a2fffSSanjay Patel; CHECK:       t:
56*aafaa2f4SSanjay Patel; CHECK-NEXT:    [[A:%.*]] = lshr i32 [[X]], 16
57204a2fffSSanjay Patel; CHECK-NEXT:    br label [[EXIT:%.*]]
58204a2fffSSanjay Patel; CHECK:       f:
59204a2fffSSanjay Patel; CHECK-NEXT:    br label [[EXIT]]
60204a2fffSSanjay Patel; CHECK:       exit:
61204a2fffSSanjay Patel; CHECK-NEXT:    [[COND:%.*]] = phi i32 [ [[A]], [[T]] ], [ 42, [[F]] ]
62204a2fffSSanjay Patel; CHECK-NEXT:    ret i32 [[COND]]
63204a2fffSSanjay Patel;
64204a2fffSSanjay Patelentry:
65204a2fffSSanjay Patel  %cmp = icmp sge i32 %x, 0
66204a2fffSSanjay Patel  br i1 %cmp, label %t, label %f
67204a2fffSSanjay Patel
68204a2fffSSanjay Patelt:
69204a2fffSSanjay Patel  %a = ashr i32 %x, 16
70204a2fffSSanjay Patel  br label %exit
71204a2fffSSanjay Patel
72204a2fffSSanjay Patelf:
73204a2fffSSanjay Patel  br label %exit
74204a2fffSSanjay Patel
75204a2fffSSanjay Patelexit:
76204a2fffSSanjay Patel  %cond = phi i32 [ %a, %t ], [ 42, %f ]
77204a2fffSSanjay Patel  ret i32 %cond
78204a2fffSSanjay Patel}
79204a2fffSSanjay Patel
80204a2fffSSanjay Patel; x is known non-negative in f block
81204a2fffSSanjay Patel
82204a2fffSSanjay Pateldefine i32 @dominating_condition_alt(i32 %x, i32 %y) {
83204a2fffSSanjay Patel; CHECK-LABEL: @dominating_condition_alt(
84204a2fffSSanjay Patel; CHECK-NEXT:  entry:
85204a2fffSSanjay Patel; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 [[X:%.*]], 2000000000
86204a2fffSSanjay Patel; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
87204a2fffSSanjay Patel; CHECK:       t:
88204a2fffSSanjay Patel; CHECK-NEXT:    br label [[EXIT:%.*]]
89204a2fffSSanjay Patel; CHECK:       f:
90*aafaa2f4SSanjay Patel; CHECK-NEXT:    [[A:%.*]] = lshr i32 [[X]], [[Y:%.*]]
91204a2fffSSanjay Patel; CHECK-NEXT:    br label [[EXIT]]
92204a2fffSSanjay Patel; CHECK:       exit:
93204a2fffSSanjay Patel; CHECK-NEXT:    [[COND:%.*]] = phi i32 [ -42, [[T]] ], [ [[A]], [[F]] ]
94204a2fffSSanjay Patel; CHECK-NEXT:    ret i32 [[COND]]
95204a2fffSSanjay Patel;
96204a2fffSSanjay Patelentry:
97204a2fffSSanjay Patel  %cmp = icmp ugt i32 %x, 2000000000
98204a2fffSSanjay Patel  br i1 %cmp, label %t, label %f
99204a2fffSSanjay Patel
100204a2fffSSanjay Patelt:
101204a2fffSSanjay Patel  br label %exit
102204a2fffSSanjay Patel
103204a2fffSSanjay Patelf:
104204a2fffSSanjay Patel  %a = ashr i32 %x, %y
105204a2fffSSanjay Patel  br label %exit
106204a2fffSSanjay Patel
107204a2fffSSanjay Patelexit:
108204a2fffSSanjay Patel  %cond = phi i32 [ -42, %t ], [ %a, %f ]
109204a2fffSSanjay Patel  ret i32 %cond
110204a2fffSSanjay Patel}
111