xref: /llvm-project/llvm/test/Transforms/SCCP/ranges-sext.ll (revision b1c59b516cbbbb17ab8ceea0a9046924d1683583)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=sccp -S %s -o -| FileCheck %s
3
4define i64 @test1_sext_op_can_be_undef(i1 %c.1, i1 %c.2) {
5; CHECK-LABEL: @test1_sext_op_can_be_undef(
6; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[TRUE_1:%.*]], label [[FALSE:%.*]]
7; CHECK:       true.1:
8; CHECK-NEXT:    br i1 [[C_2:%.*]], label [[TRUE_2:%.*]], label [[EXIT:%.*]]
9; CHECK:       true.2:
10; CHECK-NEXT:    br label [[EXIT]]
11; CHECK:       false:
12; CHECK-NEXT:    br label [[EXIT]]
13; CHECK:       exit:
14; CHECK-NEXT:    [[P:%.*]] = phi i32 [ 0, [[TRUE_1]] ], [ 1, [[TRUE_2]] ], [ undef, [[FALSE]] ]
15; CHECK-NEXT:    [[EXT:%.*]] = sext i32 [[P]] to i64
16; CHECK-NEXT:    ret i64 [[EXT]]
17;
18  br i1 %c.1, label %true.1, label %false
19
20true.1:
21  br i1 %c.2, label %true.2, label %exit
22
23true.2:
24  br label %exit
25
26false:
27  br label %exit
28
29exit:
30  %p = phi i32 [ 0, %true.1 ], [ 1, %true.2], [ undef, %false ]
31  %ext = sext i32 %p to i64
32  ret i64 %ext
33}
34
35define i64 @test1_sext_op_can_be_undef_but_frozen(i1 %c.1, i1 %c.2) {
36; CHECK-LABEL: @test1_sext_op_can_be_undef_but_frozen(
37; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[TRUE_1:%.*]], label [[FALSE:%.*]]
38; CHECK:       true.1:
39; CHECK-NEXT:    br i1 [[C_2:%.*]], label [[TRUE_2:%.*]], label [[EXIT:%.*]]
40; CHECK:       true.2:
41; CHECK-NEXT:    br label [[EXIT]]
42; CHECK:       false:
43; CHECK-NEXT:    br label [[EXIT]]
44; CHECK:       exit:
45; CHECK-NEXT:    [[P:%.*]] = phi i32 [ 0, [[TRUE_1]] ], [ 1, [[TRUE_2]] ], [ undef, [[FALSE]] ]
46; CHECK-NEXT:    [[P_FR:%.*]] = freeze i32 [[P]]
47; CHECK-NEXT:    [[EXT:%.*]] = sext i32 [[P_FR]] to i64
48; CHECK-NEXT:    ret i64 [[EXT]]
49;
50  br i1 %c.1, label %true.1, label %false
51
52true.1:
53  br i1 %c.2, label %true.2, label %exit
54
55true.2:
56  br label %exit
57
58false:
59  br label %exit
60
61exit:
62  %p = phi i32 [ 0, %true.1 ], [ 1, %true.2], [ undef, %false ]
63  %p.fr = freeze i32 %p
64  %ext = sext i32 %p.fr to i64
65  ret i64 %ext
66}
67
68define i64 @test2(i32 %x) {
69; CHECK-LABEL: @test2(
70; CHECK-NEXT:    [[P:%.*]] = and i32 [[X:%.*]], 15
71; CHECK-NEXT:    [[EXT:%.*]] = zext nneg i32 [[P]] to i64
72; CHECK-NEXT:    ret i64 [[EXT]]
73;
74  %p = and i32 %x, 15
75  %ext = sext i32 %p to i64
76  ret i64 %ext
77}
78
79define i64 @test3(i1 %c.1, i1 %c.2) {
80; CHECK-LABEL: @test3(
81; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[TRUE_1:%.*]], label [[FALSE:%.*]]
82; CHECK:       true.1:
83; CHECK-NEXT:    br i1 [[C_2:%.*]], label [[TRUE_2:%.*]], label [[EXIT:%.*]]
84; CHECK:       true.2:
85; CHECK-NEXT:    br label [[EXIT]]
86; CHECK:       false:
87; CHECK-NEXT:    br label [[EXIT]]
88; CHECK:       exit:
89; CHECK-NEXT:    [[P:%.*]] = phi i32 [ 0, [[TRUE_1]] ], [ 1, [[TRUE_2]] ], [ 3, [[FALSE]] ]
90; CHECK-NEXT:    [[EXT:%.*]] = zext nneg i32 [[P]] to i64
91; CHECK-NEXT:    ret i64 [[EXT]]
92;
93  br i1 %c.1, label %true.1, label %false
94
95true.1:
96  br i1 %c.2, label %true.2, label %exit
97
98true.2:
99  br label %exit
100
101false:
102  br label %exit
103
104exit:
105  %p = phi i32 [ 0, %true.1 ], [ 1, %true.2], [ 3, %false ]
106  %ext = sext i32 %p to i64
107  ret i64 %ext
108}
109