@@ -4,8 +4,9 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
4
4
5
5
declare i32 @__gxx_personality_v0 (...)
6
6
declare void @__cxa_call_unexpected (i8* )
7
- declare void @purefn () nounwind readnone
8
- declare i32 @read_only () nounwind readonly
7
+ declare void @purefn () nounwind readnone willreturn
8
+ declare i32 @readonly () nounwind readonly
9
+ declare i32 @readonly_willreturn () nounwind readonly willreturn
9
10
declare i32 @nounwind_fn () nounwind
10
11
declare i32 @fn ()
11
12
@@ -61,7 +62,7 @@ define i8* @f2_no_null_opt() nounwind uwtable ssp #0 personality i8* bitcast (i3
61
62
; CHECK-NEXT: [[TMP0:%.*]] = landingpad { i8*, i32 }
62
63
; CHECK-NEXT: filter [0 x i8*] zeroinitializer
63
64
; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i8*, i32 } [[TMP0]], 0
64
- ; CHECK-NEXT: tail call void @__cxa_call_unexpected(i8* [[TMP1]]) #[[ATTR6 :[0-9]+]]
65
+ ; CHECK-NEXT: tail call void @__cxa_call_unexpected(i8* [[TMP1]]) #[[ATTR7 :[0-9]+]]
65
66
; CHECK-NEXT: unreachable
66
67
;
67
68
entry:
@@ -79,13 +80,13 @@ lpad:
79
80
unreachable
80
81
}
81
82
82
- define i32 @f3 () nounwind uwtable ssp personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8* ) {
83
- ; CHECK-LABEL: @f3 (
83
+ define i32 @invoke_readonly_may_not_return () nounwind personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8* ) {
84
+ ; CHECK-LABEL: @invoke_readonly_may_not_return (
84
85
; CHECK-NEXT: entry:
85
86
; CHECK-NEXT: ret i32 3
86
87
;
87
88
entry:
88
- %call = invoke i32 @read_only ()
89
+ %call = invoke i32 @readonly ()
89
90
to label %invoke.cont unwind label %lpad
90
91
91
92
invoke .cont:
@@ -99,14 +100,34 @@ lpad:
99
100
unreachable
100
101
}
101
102
102
- define i32 @f4 () nounwind uwtable ssp personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8* ) {
103
- ; CHECK-LABEL: @f4 (
103
+ define i32 @invoke_readonly_willreturn () nounwind personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8* ) {
104
+ ; CHECK-LABEL: @invoke_readonly_willreturn (
104
105
; CHECK-NEXT: entry:
105
- ; CHECK-NEXT: [[CALL:%.*]] = call i32 @read_only()
106
+ ; CHECK-NEXT: ret i32 3
107
+ ;
108
+ entry:
109
+ %call = invoke i32 @readonly_willreturn ()
110
+ to label %invoke.cont unwind label %lpad
111
+
112
+ invoke .cont:
113
+ ret i32 3
114
+
115
+ lpad:
116
+ %0 = landingpad { i8* , i32 }
117
+ filter [0 x i8* ] zeroinitializer
118
+ %1 = extractvalue { i8* , i32 } %0 , 0
119
+ tail call void @__cxa_call_unexpected (i8* %1 ) noreturn nounwind
120
+ unreachable
121
+ }
122
+
123
+ define i32 @invoke_readonly_willreturn_with_used_retval () nounwind personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8* ) {
124
+ ; CHECK-LABEL: @invoke_readonly_willreturn_with_used_retval(
125
+ ; CHECK-NEXT: entry:
126
+ ; CHECK-NEXT: [[CALL:%.*]] = call i32 @readonly_willreturn()
106
127
; CHECK-NEXT: ret i32 [[CALL]]
107
128
;
108
129
entry:
109
- %call = invoke i32 @read_only ()
130
+ %call = invoke i32 @readonly_willreturn ()
110
131
to label %invoke.cont unwind label %lpad
111
132
112
133
invoke .cont:
@@ -136,7 +157,7 @@ define i32 @f5(i1 %cond, i8* %a, i8* %b) personality i8* bitcast (i32 (...)* @__
136
157
; CHECK: lpad:
137
158
; CHECK-NEXT: [[TMP0:%.*]] = landingpad { i8*, i32 }
138
159
; CHECK-NEXT: filter [0 x i8*] zeroinitializer
139
- ; CHECK-NEXT: tail call void @__cxa_call_unexpected(i8* [[A:%.*]]) #[[ATTR6 ]]
160
+ ; CHECK-NEXT: tail call void @__cxa_call_unexpected(i8* [[A:%.*]]) #[[ATTR7 ]]
140
161
; CHECK-NEXT: unreachable
141
162
;
142
163
entry:
0 commit comments