1
+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
1
2
; Compiler should not be broken with a dead user.
2
3
; RUN: opt -passes=sink -S < %s | FileCheck %s
3
4
4
- ; CHECK-LABEL: @test(
5
- ; CHECK: bb.0:
6
- ; CHECK-NEXT: %conv = sext i16 %p1 to i32
7
- ; CHECK-NEXT: br i1 undef, label %bb.1, label %bb.3
8
-
9
- ; CHECK: bb.1: ; preds = %bb.0
10
- ; CHECK-NEXT: br label %bb.2
11
-
12
- ; CHECK: bb.2: ; preds = %bb.2, %bb.1
13
- ; CHECK-NEXT: %and.2 = and i32 undef, %conv
14
- ; CHECK-NEXT: br label %bb.2
15
-
16
- ; CHECK: bb.3: ; preds = %bb.3, %bb.0
17
- ; CHECK-NEXT: %and.3 = and i32 undef, %conv
18
- ; CHECK-NEXT: br label %bb.3
19
-
20
- ; CHECK: dead: ; preds = %dead
21
- ; CHECK-NEXT: %and.dead = and i32 undef, %conv
22
- ; CHECK-NEXT: br label %dead
23
5
define void @test (i16 %p1 ) {
6
+ ; CHECK-LABEL: define void @test(
7
+ ; CHECK-SAME: i16 [[P1:%.*]]) {
8
+ ; CHECK-NEXT: bb.0:
9
+ ; CHECK-NEXT: [[CONV:%.*]] = sext i16 [[P1]] to i32
10
+ ; CHECK-NEXT: br i1 undef, label [[BB_1:%.*]], label [[BB_3:%.*]]
11
+ ; CHECK: bb.1:
12
+ ; CHECK-NEXT: br label [[BB_2:%.*]]
13
+ ; CHECK: bb.2:
14
+ ; CHECK-NEXT: [[AND_2:%.*]] = and i32 undef, [[CONV]]
15
+ ; CHECK-NEXT: br label [[BB_2]]
16
+ ; CHECK: bb.3:
17
+ ; CHECK-NEXT: [[AND_3:%.*]] = and i32 undef, [[CONV]]
18
+ ; CHECK-NEXT: br label [[BB_3]]
19
+ ; CHECK: dead:
20
+ ; CHECK-NEXT: [[AND_DEAD:%.*]] = and i32 undef, [[CONV]]
21
+ ; CHECK-NEXT: br label [[DEAD:%.*]]
22
+ ;
24
23
bb.0 :
25
24
%conv = sext i16 %p1 to i32
26
25
br i1 undef , label %bb.1 , label %bb.3
@@ -40,3 +39,34 @@ dead: ; preds = %dead
40
39
%and.dead = and i32 undef , %conv
41
40
br label %dead
42
41
}
42
+
43
+ define i32 @dead_from_phi (i32 %a ) {
44
+ ; CHECK-LABEL: define i32 @dead_from_phi(
45
+ ; CHECK-SAME: i32 [[A:%.*]]) {
46
+ ; CHECK-NEXT: entry:
47
+ ; CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i32 [[A]], 0
48
+ ; CHECK-NEXT: br i1 [[DOTNOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
49
+ ; CHECK: if.then:
50
+ ; CHECK-NEXT: [[B:%.*]] = and i32 undef, 65535
51
+ ; CHECK-NEXT: br label [[IF_END]]
52
+ ; CHECK: dead:
53
+ ; CHECK-NEXT: br label [[IF_END]]
54
+ ; CHECK: if.end:
55
+ ; CHECK-NEXT: [[DOT0:%.*]] = phi i32 [ [[A]], [[ENTRY:%.*]] ], [ [[B]], [[IF_THEN]] ], [ [[B]], [[DEAD:%.*]] ]
56
+ ; CHECK-NEXT: ret i32 [[DOT0]]
57
+ ;
58
+ entry:
59
+ %.not = icmp eq i32 %a , 0
60
+ br i1 %.not , label %if.end , label %if.then
61
+
62
+ if.then: ; preds = %1
63
+ %b = and i32 undef , 65535
64
+ br label %if.end
65
+
66
+ dead: ; No predecessors!
67
+ br label %if.end
68
+
69
+ if.end: ; preds = %4, %if.then, %1
70
+ %.0 = phi i32 [ %a , %entry ], [ %b , %if.then ], [ %b , %dead ]
71
+ ret i32 %.0
72
+ }
0 commit comments