@@ -5,7 +5,6 @@ declare i32 @setjmp() returns_twice
5
5
declare void @longjmp ()
6
6
declare ptr @malloc (i64 )
7
7
8
- ; FIXME: This is a miscompile.
9
8
define i32 @test () {
10
9
; CHECK-LABEL: define i32 @test() {
11
10
; CHECK-NEXT: [[MALLOC:%.*]] = call noalias ptr @malloc(i64 4)
@@ -18,7 +17,8 @@ define i32 @test() {
18
17
; CHECK-NEXT: call void @longjmp()
19
18
; CHECK-NEXT: unreachable
20
19
; CHECK: [[IF_END]]:
21
- ; CHECK-NEXT: ret i32 10
20
+ ; CHECK-NEXT: [[RES:%.*]] = load i32, ptr [[MALLOC]], align 4
21
+ ; CHECK-NEXT: ret i32 [[RES]]
22
22
;
23
23
%malloc = call noalias ptr @malloc (i64 4 )
24
24
store i32 10 , ptr %malloc , align 4
@@ -35,3 +35,65 @@ if.end:
35
35
%res = load i32 , ptr %malloc
36
36
ret i32 %res
37
37
}
38
+
39
+ ; We are still allowed to optimize non-volatile accesses to allocas.
40
+ define i32 @test_alloca () {
41
+ ; CHECK-LABEL: define i32 @test_alloca() {
42
+ ; CHECK-NEXT: [[ALLOC:%.*]] = alloca i43, align 8
43
+ ; CHECK-NEXT: store i32 10, ptr [[ALLOC]], align 4
44
+ ; CHECK-NEXT: [[SJ:%.*]] = call i32 @setjmp()
45
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[SJ]], 0
46
+ ; CHECK-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
47
+ ; CHECK: [[IF_THEN]]:
48
+ ; CHECK-NEXT: store i32 20, ptr [[ALLOC]], align 4
49
+ ; CHECK-NEXT: call void @longjmp()
50
+ ; CHECK-NEXT: unreachable
51
+ ; CHECK: [[IF_END]]:
52
+ ; CHECK-NEXT: ret i32 10
53
+ ;
54
+ %alloc = alloca i43
55
+ store i32 10 , ptr %alloc , align 4
56
+ %sj = call i32 @setjmp ()
57
+ %cmp = icmp eq i32 %sj , 0
58
+ br i1 %cmp , label %if.then , label %if.end
59
+
60
+ if.then:
61
+ store i32 20 , ptr %alloc
62
+ call void @longjmp ()
63
+ unreachable
64
+
65
+ if.end:
66
+ %res = load i32 , ptr %alloc
67
+ ret i32 %res
68
+ }
69
+
70
+ define i32 @test_alloca_volatile () {
71
+ ; CHECK-LABEL: define i32 @test_alloca_volatile() {
72
+ ; CHECK-NEXT: [[ALLOC:%.*]] = alloca i43, align 8
73
+ ; CHECK-NEXT: store volatile i32 10, ptr [[ALLOC]], align 4
74
+ ; CHECK-NEXT: [[SJ:%.*]] = call i32 @setjmp()
75
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[SJ]], 0
76
+ ; CHECK-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
77
+ ; CHECK: [[IF_THEN]]:
78
+ ; CHECK-NEXT: store volatile i32 20, ptr [[ALLOC]], align 4
79
+ ; CHECK-NEXT: call void @longjmp()
80
+ ; CHECK-NEXT: unreachable
81
+ ; CHECK: [[IF_END]]:
82
+ ; CHECK-NEXT: [[RES:%.*]] = load volatile i32, ptr [[ALLOC]], align 4
83
+ ; CHECK-NEXT: ret i32 [[RES]]
84
+ ;
85
+ %alloc = alloca i43
86
+ store volatile i32 10 , ptr %alloc , align 4
87
+ %sj = call i32 @setjmp ()
88
+ %cmp = icmp eq i32 %sj , 0
89
+ br i1 %cmp , label %if.then , label %if.end
90
+
91
+ if.then:
92
+ store volatile i32 20 , ptr %alloc
93
+ call void @longjmp ()
94
+ unreachable
95
+
96
+ if.end:
97
+ %res = load volatile i32 , ptr %alloc
98
+ ret i32 %res
99
+ }
0 commit comments