1
1
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2
2
; RUN: opt -passes=sink -S < %s | FileCheck %s
3
3
4
- ; Loads marked invariant can be sunk across critical edges
4
+ ; Loads marked invariant can be sunk across critical edges.
5
5
6
6
define <4 x float > @invariant_load (ptr %in , i32 %s ) {
7
7
; CHECK-LABEL: @invariant_load(
@@ -12,7 +12,7 @@ define <4 x float> @invariant_load(ptr %in, i32 %s) {
12
12
; CHECK-NEXT: [[Z:%.*]] = add i32 [[S]], 1
13
13
; CHECK-NEXT: br label [[END]]
14
14
; CHECK: end:
15
- ; CHECK-NEXT: [[V:%.*]] = load <4 x float>, ptr [[IN:%.*]], align 16, !invariant.load !0
15
+ ; CHECK-NEXT: [[V:%.*]] = load <4 x float>, ptr [[IN:%.*]], align 16, !invariant.load [[META0:![0-9]+]]
16
16
; CHECK-NEXT: ret <4 x float> [[V]]
17
17
;
18
18
main_body:
26
26
ret <4 x float > %v
27
27
}
28
28
29
+ ; Loads that aren't marked invariant but used in one branch
30
+ ; can be sunk to that branch.
31
+
32
+ define void @invariant_load_use_in_br (ptr %p , i1 %cond ) {
33
+ ; CHECK-LABEL: @invariant_load_use_in_br(
34
+ ; CHECK-NEXT: entry:
35
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[TRUE_BR:%.*]], label [[FALSE_BR:%.*]]
36
+ ; CHECK: true.br:
37
+ ; CHECK-NEXT: call void @fn()
38
+ ; CHECK-NEXT: br label [[EXIT:%.*]]
39
+ ; CHECK: false.br:
40
+ ; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr [[P:%.*]], align 4
41
+ ; CHECK-NEXT: call void @fn(i32 [[VAL]])
42
+ ; CHECK-NEXT: br label [[EXIT]]
43
+ ; CHECK: exit:
44
+ ; CHECK-NEXT: ret void
45
+ ;
46
+ entry:
47
+ %val = load i32 , ptr %p
48
+ br i1 %cond , label %true.br , label %false.br
49
+ true .br:
50
+ call void @fn ()
51
+ br label %exit
52
+ false .br:
53
+ call void @fn (i32 %val )
54
+ br label %exit
55
+ exit:
56
+ ret void
57
+ }
58
+
59
+ ; TODO: Invariant loads marked with metadata can be sunk past calls.
60
+
61
+ define void @invariant_load_metadata_call (ptr %p , i1 %cond ) {
62
+ ; CHECK-LABEL: @invariant_load_metadata_call(
63
+ ; CHECK-NEXT: entry:
64
+ ; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr [[P:%.*]], align 4, !invariant.load [[META0]]
65
+ ; CHECK-NEXT: call void @fn()
66
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[TRUE_BR:%.*]], label [[FALSE_BR:%.*]]
67
+ ; CHECK: true.br:
68
+ ; CHECK-NEXT: call void @fn()
69
+ ; CHECK-NEXT: br label [[EXIT:%.*]]
70
+ ; CHECK: false.br:
71
+ ; CHECK-NEXT: call void @fn(i32 [[VAL]])
72
+ ; CHECK-NEXT: br label [[EXIT]]
73
+ ; CHECK: exit:
74
+ ; CHECK-NEXT: ret void
75
+ ;
76
+ entry:
77
+ %val = load i32 , ptr %p , !invariant.load !0
78
+ call void @fn ()
79
+ br i1 %cond , label %true.br , label %false.br
80
+ true .br:
81
+ call void @fn ()
82
+ br label %exit
83
+ false .br:
84
+ call void @fn (i32 %val )
85
+ br label %exit
86
+ exit:
87
+ ret void
88
+ }
89
+
90
+ declare void @fn ()
91
+
29
92
!0 = !{}
0 commit comments