Skip to content

Commit b10e508

Browse files
committed
[GVN] Add another test for phi translation miscompile (NFC)
1 parent 1fbc6b2 commit b10e508

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -S -gvn < %s | FileCheck %s
3+
4+
; FIXME
5+
; Phi translation of %gep.j cannot use %gep.i, which is located in a context
6+
; where %i != 0, and would result in incorrect NoAlias results in a context
7+
; where %i == 0 may hold.
8+
9+
define i32 @test(i64 %i, i1 %c1, i1 %c2) {
10+
; CHECK-LABEL: @test(
11+
; CHECK-NEXT: entry:
12+
; CHECK-NEXT: [[PTR:%.*]] = alloca [2 x i32], align 4
13+
; CHECK-NEXT: br i1 [[C1:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
14+
; CHECK: if:
15+
; CHECK-NEXT: br i1 [[C2:%.*]], label [[IF2:%.*]], label [[ELSE2:%.*]]
16+
; CHECK: if2:
17+
; CHECK-NEXT: store i32 1, ptr [[PTR]], align 4
18+
; CHECK-NEXT: br label [[JOIN:%.*]]
19+
; CHECK: else2:
20+
; CHECK-NEXT: store i32 2, ptr [[PTR]], align 4
21+
; CHECK-NEXT: br label [[JOIN]]
22+
; CHECK: join:
23+
; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[I:%.*]], [[IF2]] ], [ 0, [[ELSE2]] ]
24+
; CHECK-NEXT: [[GEP_J:%.*]] = getelementptr inbounds i32, ptr [[PTR]], i64 [[J]]
25+
; CHECK-NEXT: ret i32 2
26+
; CHECK: else:
27+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[I]], 0
28+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
29+
; CHECK-NEXT: [[GEP_I:%.*]] = getelementptr inbounds i32, ptr [[PTR]], i64 [[I]]
30+
; CHECK-NEXT: ret i32 0
31+
;
32+
entry:
33+
%ptr = alloca [2 x i32]
34+
br i1 %c1, label %if, label %else
35+
36+
if:
37+
br i1 %c2, label %if2, label %else2
38+
39+
if2:
40+
store i32 1, ptr %ptr
41+
br label %join
42+
43+
else2:
44+
store i32 2, ptr %ptr
45+
br label %join
46+
47+
join:
48+
%j = phi i64 [ %i, %if2 ], [ 0, %else2 ]
49+
%gep.j = getelementptr inbounds i32, ptr %ptr, i64 %j
50+
%v = load i32, ptr %gep.j
51+
ret i32 %v
52+
53+
else:
54+
%cmp = icmp ne i64 %i, 0
55+
call void @llvm.assume(i1 %cmp)
56+
%gep.i = getelementptr inbounds i32, ptr %ptr, i64 %i
57+
ret i32 0
58+
}
59+
60+
declare void @llvm.assume(i1)

0 commit comments

Comments
 (0)