Skip to content

Commit 7eaf92b

Browse files
authored
Sink/test: increase coverage of invariant-load (#112690)
Tests adapted from: https://discourse.llvm.org/t/sinking-does-any-llvm-pass-currently-handle-load-sinking-for-invariant-loads/79643 We don't add tests for llvm.invariant.{start,end} though, as these are very difficult to support architecturally.
1 parent bafc66e commit 7eaf92b

File tree

1 file changed

+65
-2
lines changed

1 file changed

+65
-2
lines changed

llvm/test/Transforms/Sink/invariant-load.ll

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
22
; RUN: opt -passes=sink -S < %s | FileCheck %s
33

4-
; Loads marked invariant can be sunk across critical edges
4+
; Loads marked invariant can be sunk across critical edges.
55

66
define <4 x float> @invariant_load(ptr %in, i32 %s) {
77
; CHECK-LABEL: @invariant_load(
@@ -12,7 +12,7 @@ define <4 x float> @invariant_load(ptr %in, i32 %s) {
1212
; CHECK-NEXT: [[Z:%.*]] = add i32 [[S]], 1
1313
; CHECK-NEXT: br label [[END]]
1414
; 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]+]]
1616
; CHECK-NEXT: ret <4 x float> [[V]]
1717
;
1818
main_body:
@@ -26,4 +26,67 @@ end:
2626
ret <4 x float> %v
2727
}
2828

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+
2992
!0 = !{}

0 commit comments

Comments
 (0)