Skip to content

Commit 81af344

Browse files
committed
[Mem2Reg] Add test for uninitialized nonnull loads (NFC)
This shows a difference in behavior between the single block and the multi block case.
1 parent 9dc0d6a commit 81af344

File tree

1 file changed

+71
-28
lines changed

1 file changed

+71
-28
lines changed
Lines changed: 71 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
12
; RUN: opt < %s -passes=mem2reg -S | FileCheck %s
23

34
; This tests that mem2reg preserves the !nonnull metadata on loads
45
; from allocas that get optimized out.
56

67
; Check the case where the alloca in question has a single store.
78
define float* @single_store(float** %arg) {
8-
; CHECK-LABEL: define float* @single_store
9-
; CHECK: %arg.load = load float*, float** %arg, align 8
10-
; CHECK: [[ASSUME:%(.*)]] = icmp ne float* %arg.load, null
11-
; CHECK: call void @llvm.assume(i1 {{.*}}[[ASSUME]])
12-
; CHECK: ret float* %arg.load
9+
; CHECK-LABEL: @single_store(
10+
; CHECK-NEXT: entry:
11+
; CHECK-NEXT: [[ARG_LOAD:%.*]] = load float*, float** [[ARG:%.*]], align 8
12+
; CHECK-NEXT: [[TMP0:%.*]] = icmp ne float* [[ARG_LOAD]], null
13+
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]])
14+
; CHECK-NEXT: ret float* [[ARG_LOAD]]
15+
;
1316
entry:
1417
%buf = alloca float*
1518
%arg.load = load float*, float** %arg, align 8
@@ -21,11 +24,13 @@ entry:
2124
; Check the case where the alloca in question has more than one
2225
; store but still within one basic block.
2326
define float* @single_block(float** %arg) {
24-
; CHECK-LABEL: define float* @single_block
25-
; CHECK: %arg.load = load float*, float** %arg, align 8
26-
; CHECK: [[ASSUME:%(.*)]] = icmp ne float* %arg.load, null
27-
; CHECK: call void @llvm.assume(i1 {{.*}}[[ASSUME]])
28-
; CHECK: ret float* %arg.load
27+
; CHECK-LABEL: @single_block(
28+
; CHECK-NEXT: entry:
29+
; CHECK-NEXT: [[ARG_LOAD:%.*]] = load float*, float** [[ARG:%.*]], align 8
30+
; CHECK-NEXT: [[TMP0:%.*]] = icmp ne float* [[ARG_LOAD]], null
31+
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]])
32+
; CHECK-NEXT: ret float* [[ARG_LOAD]]
33+
;
2934
entry:
3035
%buf = alloca float*
3136
%arg.load = load float*, float** %arg, align 8
@@ -38,14 +43,15 @@ entry:
3843
; Check the case where the alloca in question has more than one
3944
; store and also reads ands writes in multiple blocks.
4045
define float* @multi_block(float** %arg) {
41-
; CHECK-LABEL: define float* @multi_block
42-
; CHECK-LABEL: entry:
43-
; CHECK: %arg.load = load float*, float** %arg, align 8
44-
; CHECK: br label %next
45-
; CHECK-LABEL: next:
46-
; CHECK: [[ASSUME:%(.*)]] = icmp ne float* %arg.load, null
47-
; CHECK: call void @llvm.assume(i1 {{.*}}[[ASSUME]])
48-
; CHECK: ret float* %arg.load
46+
; CHECK-LABEL: @multi_block(
47+
; CHECK-NEXT: entry:
48+
; CHECK-NEXT: [[ARG_LOAD:%.*]] = load float*, float** [[ARG:%.*]], align 8
49+
; CHECK-NEXT: br label [[NEXT:%.*]]
50+
; CHECK: next:
51+
; CHECK-NEXT: [[TMP0:%.*]] = icmp ne float* [[ARG_LOAD]], null
52+
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]])
53+
; CHECK-NEXT: ret float* [[ARG_LOAD]]
54+
;
4955
entry:
5056
%buf = alloca float*
5157
%arg.load = load float*, float** %arg, align 8
@@ -60,16 +66,16 @@ next:
6066
; Check that we don't add an assume if it's not
6167
; necessary i.e. the value is already implied to be nonnull
6268
define float* @no_assume(float** %arg) {
63-
; CHECK-LABEL: define float* @no_assume
64-
; CHECK-LABEL: entry:
65-
; CHECK: %arg.load = load float*, float** %arg, align 8
66-
; CHECK: %cn = icmp ne float* %arg.load, null
67-
; CHECK: br i1 %cn, label %next, label %fin
68-
; CHECK-LABEL: next:
69-
; CHECK-NOT: call void @llvm.assume
70-
; CHECK: ret float* %arg.load
71-
; CHECK-LABEL: fin:
72-
; CHECK: ret float* null
69+
; CHECK-LABEL: @no_assume(
70+
; CHECK-NEXT: entry:
71+
; CHECK-NEXT: [[ARG_LOAD:%.*]] = load float*, float** [[ARG:%.*]], align 8
72+
; CHECK-NEXT: [[CN:%.*]] = icmp ne float* [[ARG_LOAD]], null
73+
; CHECK-NEXT: br i1 [[CN]], label [[NEXT:%.*]], label [[FIN:%.*]]
74+
; CHECK: next:
75+
; CHECK-NEXT: ret float* [[ARG_LOAD]]
76+
; CHECK: fin:
77+
; CHECK-NEXT: ret float* null
78+
;
7379
entry:
7480
%buf = alloca float*
7581
%arg.load = load float*, float** %arg, align 8
@@ -86,4 +92,41 @@ fin:
8692
ret float* null
8793
}
8894

95+
define float* @no_store_single_load() {
96+
; CHECK-LABEL: @no_store_single_load(
97+
; CHECK-NEXT: entry:
98+
; CHECK-NEXT: ret float* undef
99+
;
100+
entry:
101+
%buf = alloca float*
102+
%buf.load = load float*, float **%buf, !nonnull !0
103+
ret float* %buf.load
104+
}
105+
106+
define float* @no_store_multiple_loads(i1 %c) {
107+
; CHECK-LABEL: @no_store_multiple_loads(
108+
; CHECK-NEXT: entry:
109+
; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
110+
; CHECK: if:
111+
; CHECK-NEXT: [[TMP0:%.*]] = icmp ne float* undef, null
112+
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]])
113+
; CHECK-NEXT: ret float* undef
114+
; CHECK: else:
115+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne float* undef, null
116+
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP1]])
117+
; CHECK-NEXT: ret float* undef
118+
;
119+
entry:
120+
%buf = alloca float*
121+
br i1 %c, label %if, label %else
122+
123+
if:
124+
%buf.load = load float*, float **%buf, !nonnull !0
125+
ret float* %buf.load
126+
127+
else:
128+
%buf.load2 = load float*, float **%buf, !nonnull !0
129+
ret float* %buf.load2
130+
}
131+
89132
!0 = !{}

0 commit comments

Comments
 (0)