@@ -397,20 +397,20 @@ define internal ptr @f1(ptr %arg) {
397
397
; TUNIT-NEXT: [[TMP:%.*]] = icmp eq ptr [[ARG]], null
398
398
; TUNIT-NEXT: br i1 [[TMP]], label [[BB9:%.*]], label [[BB1:%.*]]
399
399
; TUNIT: bb1:
400
- ; TUNIT-NEXT: [[TRUETMP2 :%.*]] = load i32, ptr [[ARG]], align 4
401
- ; TUNIT-NEXT: [[TRUETMP3 :%.*]] = icmp eq i32 [[TRUETMP2 ]], 0
402
- ; TUNIT-NEXT: br i1 [[TRUETMP3 ]], label [[BB6:%.*]], label [[BB4:%.*]]
400
+ ; TUNIT-NEXT: [[TMP2 :%.*]] = load i32, ptr [[ARG]], align 4
401
+ ; TUNIT-NEXT: [[TMP3 :%.*]] = icmp eq i32 [[TMP2 ]], 0
402
+ ; TUNIT-NEXT: br i1 [[TMP3 ]], label [[BB6:%.*]], label [[BB4:%.*]]
403
403
; TUNIT: bb4:
404
- ; TUNIT-NEXT: [[TRUETMP5 :%.*]] = getelementptr inbounds i32, ptr [[ARG]], i64 1
405
- ; TUNIT-NEXT: [[TMP5B:%.*]] = tail call ptr @f3(ptr nofree nonnull readonly [[TRUETMP5 ]]) #[[ATTR16:[0-9]+]]
404
+ ; TUNIT-NEXT: [[TMP5 :%.*]] = getelementptr inbounds i32, ptr [[ARG]], i64 1
405
+ ; TUNIT-NEXT: [[TMP5B:%.*]] = tail call ptr @f3(ptr nofree nonnull readonly [[TMP5 ]]) #[[ATTR16:[0-9]+]]
406
406
; TUNIT-NEXT: [[TMP5C:%.*]] = getelementptr inbounds i32, ptr [[TMP5B]], i64 -1
407
407
; TUNIT-NEXT: br label [[BB9]]
408
408
; TUNIT: bb6:
409
- ; TUNIT-NEXT: [[TRUETMP7 :%.*]] = tail call ptr @f2(ptr nofree nonnull readonly align 4 dereferenceable(4) [[ARG]]) #[[ATTR16]]
410
- ; TUNIT-NEXT: ret ptr [[TRUETMP7 ]]
409
+ ; TUNIT-NEXT: [[TMP7 :%.*]] = tail call ptr @f2(ptr nofree nonnull readonly align 4 dereferenceable(4) [[ARG]]) #[[ATTR16]]
410
+ ; TUNIT-NEXT: ret ptr [[TMP7 ]]
411
411
; TUNIT: bb9:
412
- ; TUNIT-NEXT: [[TRUETMP10 :%.*]] = phi ptr [ [[TMP5C]], [[BB4]] ], [ inttoptr (i64 4 to ptr), [[BB:%.*]] ]
413
- ; TUNIT-NEXT: ret ptr [[TRUETMP10 ]]
412
+ ; TUNIT-NEXT: [[TMP10 :%.*]] = phi ptr [ [[TMP5C]], [[BB4]] ], [ inttoptr (i64 4 to ptr), [[BB:%.*]] ]
413
+ ; TUNIT-NEXT: ret ptr [[TMP10 ]]
414
414
;
415
415
; CGSCC: Function Attrs: nofree nosync nounwind memory(argmem: read)
416
416
; CGSCC-LABEL: define {{[^@]+}}@f1
@@ -419,20 +419,20 @@ define internal ptr @f1(ptr %arg) {
419
419
; CGSCC-NEXT: [[TMP:%.*]] = icmp eq ptr [[ARG]], null
420
420
; CGSCC-NEXT: br i1 [[TMP]], label [[BB9:%.*]], label [[BB1:%.*]]
421
421
; CGSCC: bb1:
422
- ; CGSCC-NEXT: [[TRUETMP2 :%.*]] = load i32, ptr [[ARG]], align 4
423
- ; CGSCC-NEXT: [[TRUETMP3 :%.*]] = icmp eq i32 [[TRUETMP2 ]], 0
424
- ; CGSCC-NEXT: br i1 [[TRUETMP3 ]], label [[BB6:%.*]], label [[BB4:%.*]]
422
+ ; CGSCC-NEXT: [[TMP2 :%.*]] = load i32, ptr [[ARG]], align 4
423
+ ; CGSCC-NEXT: [[TMP3 :%.*]] = icmp eq i32 [[TMP2 ]], 0
424
+ ; CGSCC-NEXT: br i1 [[TMP3 ]], label [[BB6:%.*]], label [[BB4:%.*]]
425
425
; CGSCC: bb4:
426
- ; CGSCC-NEXT: [[TRUETMP5 :%.*]] = getelementptr inbounds i32, ptr [[ARG]], i64 1
427
- ; CGSCC-NEXT: [[TMP5B:%.*]] = tail call ptr @f3(ptr nofree nonnull readonly [[TRUETMP5 ]]) #[[ATTR16:[0-9]+]]
426
+ ; CGSCC-NEXT: [[TMP5 :%.*]] = getelementptr inbounds i32, ptr [[ARG]], i64 1
427
+ ; CGSCC-NEXT: [[TMP5B:%.*]] = tail call ptr @f3(ptr nofree nonnull readonly [[TMP5 ]]) #[[ATTR16:[0-9]+]]
428
428
; CGSCC-NEXT: [[TMP5C:%.*]] = getelementptr inbounds i32, ptr [[TMP5B]], i64 -1
429
429
; CGSCC-NEXT: br label [[BB9]]
430
430
; CGSCC: bb6:
431
- ; CGSCC-NEXT: [[TRUETMP7 :%.*]] = tail call ptr @f2(ptr nofree nonnull readonly align 4 dereferenceable(4) [[ARG]]) #[[ATTR16]]
432
- ; CGSCC-NEXT: ret ptr [[TRUETMP7 ]]
431
+ ; CGSCC-NEXT: [[TMP7 :%.*]] = tail call ptr @f2(ptr nofree nonnull readonly align 4 dereferenceable(4) [[ARG]]) #[[ATTR16]]
432
+ ; CGSCC-NEXT: ret ptr [[TMP7 ]]
433
433
; CGSCC: bb9:
434
- ; CGSCC-NEXT: [[TRUETMP10 :%.*]] = phi ptr [ [[TMP5C]], [[BB4]] ], [ inttoptr (i64 4 to ptr), [[BB:%.*]] ]
435
- ; CGSCC-NEXT: ret ptr [[TRUETMP10 ]]
434
+ ; CGSCC-NEXT: [[TMP10 :%.*]] = phi ptr [ [[TMP5C]], [[BB4]] ], [ inttoptr (i64 4 to ptr), [[BB:%.*]] ]
435
+ ; CGSCC-NEXT: ret ptr [[TMP10 ]]
436
436
;
437
437
438
438
bb:
@@ -1100,33 +1100,33 @@ define i32 @nonnull_exec_ctx_1(ptr %a, i32 %b) {
1100
1100
; TUNIT-LABEL: define {{[^@]+}}@nonnull_exec_ctx_1
1101
1101
; TUNIT-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR8]] {
1102
1102
; TUNIT-NEXT: en:
1103
- ; TUNIT-NEXT: [[TRUETMP3 :%.*]] = icmp eq i32 [[B]], 0
1104
- ; TUNIT-NEXT: br i1 [[TRUETMP3 ]], label [[EX:%.*]], label [[HD:%.*]]
1103
+ ; TUNIT-NEXT: [[TMP3 :%.*]] = icmp eq i32 [[B]], 0
1104
+ ; TUNIT-NEXT: br i1 [[TMP3 ]], label [[EX:%.*]], label [[HD:%.*]]
1105
1105
; TUNIT: ex:
1106
- ; TUNIT-NEXT: [[TRUETMP5 :%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR7]]
1107
- ; TUNIT-NEXT: ret i32 [[TRUETMP5 ]]
1106
+ ; TUNIT-NEXT: [[TMP5 :%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR7]]
1107
+ ; TUNIT-NEXT: ret i32 [[TMP5 ]]
1108
1108
; TUNIT: hd:
1109
- ; TUNIT-NEXT: [[TRUETMP7 :%.*]] = phi i32 [ [[TRUETMP8 :%.*]], [[HD]] ], [ 0, [[EN:%.*]] ]
1109
+ ; TUNIT-NEXT: [[TMP7 :%.*]] = phi i32 [ [[TMP8 :%.*]], [[HD]] ], [ 0, [[EN:%.*]] ]
1110
1110
; TUNIT-NEXT: tail call void @h(ptr [[A]]) #[[ATTR7]]
1111
- ; TUNIT-NEXT: [[TRUETMP8 ]] = add nuw i32 [[TRUETMP7 ]], 1
1112
- ; TUNIT-NEXT: [[TRUETMP9 :%.*]] = icmp eq i32 [[TRUETMP8 ]], [[B]]
1113
- ; TUNIT-NEXT: br i1 [[TRUETMP9 ]], label [[EX]], label [[HD]]
1111
+ ; TUNIT-NEXT: [[TMP8 ]] = add nuw i32 [[TMP7 ]], 1
1112
+ ; TUNIT-NEXT: [[TMP9 :%.*]] = icmp eq i32 [[TMP8 ]], [[B]]
1113
+ ; TUNIT-NEXT: br i1 [[TMP9 ]], label [[EX]], label [[HD]]
1114
1114
;
1115
1115
; CGSCC: Function Attrs: mustprogress nounwind willreturn
1116
1116
; CGSCC-LABEL: define {{[^@]+}}@nonnull_exec_ctx_1
1117
1117
; CGSCC-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] {
1118
1118
; CGSCC-NEXT: en:
1119
- ; CGSCC-NEXT: [[TRUETMP3 :%.*]] = icmp eq i32 [[B]], 0
1120
- ; CGSCC-NEXT: br i1 [[TRUETMP3 ]], label [[EX:%.*]], label [[HD:%.*]]
1119
+ ; CGSCC-NEXT: [[TMP3 :%.*]] = icmp eq i32 [[B]], 0
1120
+ ; CGSCC-NEXT: br i1 [[TMP3 ]], label [[EX:%.*]], label [[HD:%.*]]
1121
1121
; CGSCC: ex:
1122
- ; CGSCC-NEXT: [[TRUETMP5 :%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR6]]
1123
- ; CGSCC-NEXT: ret i32 [[TRUETMP5 ]]
1122
+ ; CGSCC-NEXT: [[TMP5 :%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR6]]
1123
+ ; CGSCC-NEXT: ret i32 [[TMP5 ]]
1124
1124
; CGSCC: hd:
1125
- ; CGSCC-NEXT: [[TRUETMP7 :%.*]] = phi i32 [ [[TRUETMP8 :%.*]], [[HD]] ], [ 0, [[EN:%.*]] ]
1125
+ ; CGSCC-NEXT: [[TMP7 :%.*]] = phi i32 [ [[TMP8 :%.*]], [[HD]] ], [ 0, [[EN:%.*]] ]
1126
1126
; CGSCC-NEXT: tail call void @h(ptr [[A]]) #[[ATTR6]]
1127
- ; CGSCC-NEXT: [[TRUETMP8 ]] = add nuw i32 [[TRUETMP7 ]], 1
1128
- ; CGSCC-NEXT: [[TRUETMP9 :%.*]] = icmp eq i32 [[TRUETMP8 ]], [[B]]
1129
- ; CGSCC-NEXT: br i1 [[TRUETMP9 ]], label [[EX]], label [[HD]]
1127
+ ; CGSCC-NEXT: [[TMP8 ]] = add nuw i32 [[TMP7 ]], 1
1128
+ ; CGSCC-NEXT: [[TMP9 :%.*]] = icmp eq i32 [[TMP8 ]], [[B]]
1129
+ ; CGSCC-NEXT: br i1 [[TMP9 ]], label [[EX]], label [[HD]]
1130
1130
;
1131
1131
en:
1132
1132
%tmp3 = icmp eq i32 %b , 0
@@ -1150,37 +1150,37 @@ define i32 @nonnull_exec_ctx_1b(ptr %a, i32 %b) {
1150
1150
; TUNIT-LABEL: define {{[^@]+}}@nonnull_exec_ctx_1b
1151
1151
; TUNIT-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR8]] {
1152
1152
; TUNIT-NEXT: en:
1153
- ; TUNIT-NEXT: [[TRUETMP3 :%.*]] = icmp eq i32 [[B]], 0
1154
- ; TUNIT-NEXT: br i1 [[TRUETMP3 ]], label [[EX:%.*]], label [[HD:%.*]]
1153
+ ; TUNIT-NEXT: [[TMP3 :%.*]] = icmp eq i32 [[B]], 0
1154
+ ; TUNIT-NEXT: br i1 [[TMP3 ]], label [[EX:%.*]], label [[HD:%.*]]
1155
1155
; TUNIT: ex:
1156
- ; TUNIT-NEXT: [[TRUETMP5 :%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR7]]
1157
- ; TUNIT-NEXT: ret i32 [[TRUETMP5 ]]
1156
+ ; TUNIT-NEXT: [[TMP5 :%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR7]]
1157
+ ; TUNIT-NEXT: ret i32 [[TMP5 ]]
1158
1158
; TUNIT: hd:
1159
- ; TUNIT-NEXT: [[TRUETMP7 :%.*]] = phi i32 [ [[TRUETMP8 :%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ]
1159
+ ; TUNIT-NEXT: [[TMP7 :%.*]] = phi i32 [ [[TMP8 :%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ]
1160
1160
; TUNIT-NEXT: tail call void @h(ptr [[A]]) #[[ATTR7]]
1161
1161
; TUNIT-NEXT: br label [[HD2]]
1162
1162
; TUNIT: hd2:
1163
- ; TUNIT-NEXT: [[TRUETMP8 ]] = add nuw i32 [[TRUETMP7 ]], 1
1164
- ; TUNIT-NEXT: [[TRUETMP9 :%.*]] = icmp eq i32 [[TRUETMP8 ]], [[B]]
1165
- ; TUNIT-NEXT: br i1 [[TRUETMP9 ]], label [[EX]], label [[HD]]
1163
+ ; TUNIT-NEXT: [[TMP8 ]] = add nuw i32 [[TMP7 ]], 1
1164
+ ; TUNIT-NEXT: [[TMP9 :%.*]] = icmp eq i32 [[TMP8 ]], [[B]]
1165
+ ; TUNIT-NEXT: br i1 [[TMP9 ]], label [[EX]], label [[HD]]
1166
1166
;
1167
1167
; CGSCC: Function Attrs: mustprogress nounwind willreturn
1168
1168
; CGSCC-LABEL: define {{[^@]+}}@nonnull_exec_ctx_1b
1169
1169
; CGSCC-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] {
1170
1170
; CGSCC-NEXT: en:
1171
- ; CGSCC-NEXT: [[TRUETMP3 :%.*]] = icmp eq i32 [[B]], 0
1172
- ; CGSCC-NEXT: br i1 [[TRUETMP3 ]], label [[EX:%.*]], label [[HD:%.*]]
1171
+ ; CGSCC-NEXT: [[TMP3 :%.*]] = icmp eq i32 [[B]], 0
1172
+ ; CGSCC-NEXT: br i1 [[TMP3 ]], label [[EX:%.*]], label [[HD:%.*]]
1173
1173
; CGSCC: ex:
1174
- ; CGSCC-NEXT: [[TRUETMP5 :%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR6]]
1175
- ; CGSCC-NEXT: ret i32 [[TRUETMP5 ]]
1174
+ ; CGSCC-NEXT: [[TMP5 :%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR6]]
1175
+ ; CGSCC-NEXT: ret i32 [[TMP5 ]]
1176
1176
; CGSCC: hd:
1177
- ; CGSCC-NEXT: [[TRUETMP7 :%.*]] = phi i32 [ [[TRUETMP8 :%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ]
1177
+ ; CGSCC-NEXT: [[TMP7 :%.*]] = phi i32 [ [[TMP8 :%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ]
1178
1178
; CGSCC-NEXT: tail call void @h(ptr [[A]]) #[[ATTR6]]
1179
1179
; CGSCC-NEXT: br label [[HD2]]
1180
1180
; CGSCC: hd2:
1181
- ; CGSCC-NEXT: [[TRUETMP8 ]] = add nuw i32 [[TRUETMP7 ]], 1
1182
- ; CGSCC-NEXT: [[TRUETMP9 :%.*]] = icmp eq i32 [[TRUETMP8 ]], [[B]]
1183
- ; CGSCC-NEXT: br i1 [[TRUETMP9 ]], label [[EX]], label [[HD]]
1181
+ ; CGSCC-NEXT: [[TMP8 ]] = add nuw i32 [[TMP7 ]], 1
1182
+ ; CGSCC-NEXT: [[TMP9 :%.*]] = icmp eq i32 [[TMP8 ]], [[B]]
1183
+ ; CGSCC-NEXT: br i1 [[TMP9 ]], label [[EX]], label [[HD]]
1184
1184
;
1185
1185
en:
1186
1186
%tmp3 = icmp eq i32 %b , 0
@@ -1207,33 +1207,33 @@ define i32 @nonnull_exec_ctx_2(ptr %a, i32 %b) willreturn nounwind {
1207
1207
; TUNIT-LABEL: define {{[^@]+}}@nonnull_exec_ctx_2
1208
1208
; TUNIT-SAME: (ptr nonnull [[A:%.*]], i32 [[B:%.*]]) #[[ATTR8]] {
1209
1209
; TUNIT-NEXT: en:
1210
- ; TUNIT-NEXT: [[TRUETMP3 :%.*]] = icmp eq i32 [[B]], 0
1211
- ; TUNIT-NEXT: br i1 [[TRUETMP3 ]], label [[EX:%.*]], label [[HD:%.*]]
1210
+ ; TUNIT-NEXT: [[TMP3 :%.*]] = icmp eq i32 [[B]], 0
1211
+ ; TUNIT-NEXT: br i1 [[TMP3 ]], label [[EX:%.*]], label [[HD:%.*]]
1212
1212
; TUNIT: ex:
1213
- ; TUNIT-NEXT: [[TRUETMP5 :%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR5]]
1214
- ; TUNIT-NEXT: ret i32 [[TRUETMP5 ]]
1213
+ ; TUNIT-NEXT: [[TMP5 :%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR5]]
1214
+ ; TUNIT-NEXT: ret i32 [[TMP5 ]]
1215
1215
; TUNIT: hd:
1216
- ; TUNIT-NEXT: [[TRUETMP7 :%.*]] = phi i32 [ [[TRUETMP8 :%.*]], [[HD]] ], [ 0, [[EN:%.*]] ]
1216
+ ; TUNIT-NEXT: [[TMP7 :%.*]] = phi i32 [ [[TMP8 :%.*]], [[HD]] ], [ 0, [[EN:%.*]] ]
1217
1217
; TUNIT-NEXT: tail call void @h(ptr nonnull [[A]]) #[[ATTR5]]
1218
- ; TUNIT-NEXT: [[TRUETMP8 ]] = add nuw i32 [[TRUETMP7 ]], 1
1219
- ; TUNIT-NEXT: [[TRUETMP9 :%.*]] = icmp eq i32 [[TRUETMP8 ]], [[B]]
1220
- ; TUNIT-NEXT: br i1 [[TRUETMP9 ]], label [[EX]], label [[HD]]
1218
+ ; TUNIT-NEXT: [[TMP8 ]] = add nuw i32 [[TMP7 ]], 1
1219
+ ; TUNIT-NEXT: [[TMP9 :%.*]] = icmp eq i32 [[TMP8 ]], [[B]]
1220
+ ; TUNIT-NEXT: br i1 [[TMP9 ]], label [[EX]], label [[HD]]
1221
1221
;
1222
1222
; CGSCC: Function Attrs: mustprogress nounwind willreturn
1223
1223
; CGSCC-LABEL: define {{[^@]+}}@nonnull_exec_ctx_2
1224
1224
; CGSCC-SAME: (ptr nonnull [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] {
1225
1225
; CGSCC-NEXT: en:
1226
- ; CGSCC-NEXT: [[TRUETMP3 :%.*]] = icmp eq i32 [[B]], 0
1227
- ; CGSCC-NEXT: br i1 [[TRUETMP3 ]], label [[EX:%.*]], label [[HD:%.*]]
1226
+ ; CGSCC-NEXT: [[TMP3 :%.*]] = icmp eq i32 [[B]], 0
1227
+ ; CGSCC-NEXT: br i1 [[TMP3 ]], label [[EX:%.*]], label [[HD:%.*]]
1228
1228
; CGSCC: ex:
1229
- ; CGSCC-NEXT: [[TRUETMP5 :%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR4]]
1230
- ; CGSCC-NEXT: ret i32 [[TRUETMP5 ]]
1229
+ ; CGSCC-NEXT: [[TMP5 :%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR4]]
1230
+ ; CGSCC-NEXT: ret i32 [[TMP5 ]]
1231
1231
; CGSCC: hd:
1232
- ; CGSCC-NEXT: [[TRUETMP7 :%.*]] = phi i32 [ [[TRUETMP8 :%.*]], [[HD]] ], [ 0, [[EN:%.*]] ]
1232
+ ; CGSCC-NEXT: [[TMP7 :%.*]] = phi i32 [ [[TMP8 :%.*]], [[HD]] ], [ 0, [[EN:%.*]] ]
1233
1233
; CGSCC-NEXT: tail call void @h(ptr nonnull [[A]]) #[[ATTR4]]
1234
- ; CGSCC-NEXT: [[TRUETMP8 ]] = add nuw i32 [[TRUETMP7 ]], 1
1235
- ; CGSCC-NEXT: [[TRUETMP9 :%.*]] = icmp eq i32 [[TRUETMP8 ]], [[B]]
1236
- ; CGSCC-NEXT: br i1 [[TRUETMP9 ]], label [[EX]], label [[HD]]
1234
+ ; CGSCC-NEXT: [[TMP8 ]] = add nuw i32 [[TMP7 ]], 1
1235
+ ; CGSCC-NEXT: [[TMP9 :%.*]] = icmp eq i32 [[TMP8 ]], [[B]]
1236
+ ; CGSCC-NEXT: br i1 [[TMP9 ]], label [[EX]], label [[HD]]
1237
1237
;
1238
1238
en:
1239
1239
%tmp3 = icmp eq i32 %b , 0
@@ -1257,37 +1257,37 @@ define i32 @nonnull_exec_ctx_2b(ptr %a, i32 %b) willreturn nounwind {
1257
1257
; TUNIT-LABEL: define {{[^@]+}}@nonnull_exec_ctx_2b
1258
1258
; TUNIT-SAME: (ptr nonnull [[A:%.*]], i32 [[B:%.*]]) #[[ATTR8]] {
1259
1259
; TUNIT-NEXT: en:
1260
- ; TUNIT-NEXT: [[TRUETMP3 :%.*]] = icmp eq i32 [[B]], 0
1261
- ; TUNIT-NEXT: br i1 [[TRUETMP3 ]], label [[EX:%.*]], label [[HD:%.*]]
1260
+ ; TUNIT-NEXT: [[TMP3 :%.*]] = icmp eq i32 [[B]], 0
1261
+ ; TUNIT-NEXT: br i1 [[TMP3 ]], label [[EX:%.*]], label [[HD:%.*]]
1262
1262
; TUNIT: ex:
1263
- ; TUNIT-NEXT: [[TRUETMP5 :%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR5]]
1264
- ; TUNIT-NEXT: ret i32 [[TRUETMP5 ]]
1263
+ ; TUNIT-NEXT: [[TMP5 :%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR5]]
1264
+ ; TUNIT-NEXT: ret i32 [[TMP5 ]]
1265
1265
; TUNIT: hd:
1266
- ; TUNIT-NEXT: [[TRUETMP7 :%.*]] = phi i32 [ [[TRUETMP8 :%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ]
1266
+ ; TUNIT-NEXT: [[TMP7 :%.*]] = phi i32 [ [[TMP8 :%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ]
1267
1267
; TUNIT-NEXT: tail call void @h(ptr nonnull [[A]]) #[[ATTR5]]
1268
1268
; TUNIT-NEXT: br label [[HD2]]
1269
1269
; TUNIT: hd2:
1270
- ; TUNIT-NEXT: [[TRUETMP8 ]] = add nuw i32 [[TRUETMP7 ]], 1
1271
- ; TUNIT-NEXT: [[TRUETMP9 :%.*]] = icmp eq i32 [[TRUETMP8 ]], [[B]]
1272
- ; TUNIT-NEXT: br i1 [[TRUETMP9 ]], label [[EX]], label [[HD]]
1270
+ ; TUNIT-NEXT: [[TMP8 ]] = add nuw i32 [[TMP7 ]], 1
1271
+ ; TUNIT-NEXT: [[TMP9 :%.*]] = icmp eq i32 [[TMP8 ]], [[B]]
1272
+ ; TUNIT-NEXT: br i1 [[TMP9 ]], label [[EX]], label [[HD]]
1273
1273
;
1274
1274
; CGSCC: Function Attrs: mustprogress nounwind willreturn
1275
1275
; CGSCC-LABEL: define {{[^@]+}}@nonnull_exec_ctx_2b
1276
1276
; CGSCC-SAME: (ptr nonnull [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] {
1277
1277
; CGSCC-NEXT: en:
1278
- ; CGSCC-NEXT: [[TRUETMP3 :%.*]] = icmp eq i32 [[B]], 0
1279
- ; CGSCC-NEXT: br i1 [[TRUETMP3 ]], label [[EX:%.*]], label [[HD:%.*]]
1278
+ ; CGSCC-NEXT: [[TMP3 :%.*]] = icmp eq i32 [[B]], 0
1279
+ ; CGSCC-NEXT: br i1 [[TMP3 ]], label [[EX:%.*]], label [[HD:%.*]]
1280
1280
; CGSCC: ex:
1281
- ; CGSCC-NEXT: [[TRUETMP5 :%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR4]]
1282
- ; CGSCC-NEXT: ret i32 [[TRUETMP5 ]]
1281
+ ; CGSCC-NEXT: [[TMP5 :%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR4]]
1282
+ ; CGSCC-NEXT: ret i32 [[TMP5 ]]
1283
1283
; CGSCC: hd:
1284
- ; CGSCC-NEXT: [[TRUETMP7 :%.*]] = phi i32 [ [[TRUETMP8 :%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ]
1284
+ ; CGSCC-NEXT: [[TMP7 :%.*]] = phi i32 [ [[TMP8 :%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ]
1285
1285
; CGSCC-NEXT: tail call void @h(ptr nonnull [[A]]) #[[ATTR4]]
1286
1286
; CGSCC-NEXT: br label [[HD2]]
1287
1287
; CGSCC: hd2:
1288
- ; CGSCC-NEXT: [[TRUETMP8 ]] = add nuw i32 [[TRUETMP7 ]], 1
1289
- ; CGSCC-NEXT: [[TRUETMP9 :%.*]] = icmp eq i32 [[TRUETMP8 ]], [[B]]
1290
- ; CGSCC-NEXT: br i1 [[TRUETMP9 ]], label [[EX]], label [[HD]]
1288
+ ; CGSCC-NEXT: [[TMP8 ]] = add nuw i32 [[TMP7 ]], 1
1289
+ ; CGSCC-NEXT: [[TMP9 :%.*]] = icmp eq i32 [[TMP8 ]], [[B]]
1290
+ ; CGSCC-NEXT: br i1 [[TMP9 ]], label [[EX]], label [[HD]]
1291
1291
;
1292
1292
en:
1293
1293
%tmp3 = icmp eq i32 %b , 0
@@ -1525,6 +1525,92 @@ define void @nonnull_caller(ptr %p) {
1525
1525
1526
1526
declare void @nonnull_callee (ptr nonnull %p )
1527
1527
1528
+ define ptr @phi (ptr %p ) {
1529
+ ; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
1530
+ ; CHECK-LABEL: define {{[^@]+}}@phi
1531
+ ; CHECK-SAME: (ptr nofree readnone [[P:%.*]]) #[[ATTR1]] {
1532
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P]], null
1533
+ ; CHECK-NEXT: [[G:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 1
1534
+ ; CHECK-NEXT: br i1 [[C]], label [[NULL:%.*]], label [[NNULL:%.*]]
1535
+ ; CHECK: NNULL:
1536
+ ; CHECK-NEXT: br label [[MERGE:%.*]]
1537
+ ; CHECK: NULL:
1538
+ ; CHECK-NEXT: br label [[MERGE]]
1539
+ ; CHECK: merge:
1540
+ ; CHECK-NEXT: [[PHI:%.*]] = phi ptr [ [[P]], [[NNULL]] ], [ [[G]], [[NULL]] ]
1541
+ ; CHECK-NEXT: ret ptr [[PHI]]
1542
+ ;
1543
+ %c = icmp eq ptr %p , null
1544
+ %g = getelementptr inbounds i8 , ptr %p , i64 1
1545
+ br i1 %c , label %NULL , label %NNULL
1546
+ NNULL:
1547
+ br label %merge
1548
+ NULL:
1549
+ br label %merge
1550
+ merge:
1551
+ %phi = phi ptr [%p , %NNULL ], [%g , %NULL ]
1552
+ ret ptr %phi
1553
+ }
1554
+ define void @phi_caller (ptr %p ) {
1555
+ ; TUNIT: Function Attrs: nounwind
1556
+ ; TUNIT-LABEL: define {{[^@]+}}@phi_caller
1557
+ ; TUNIT-SAME: (ptr nofree [[P:%.*]]) #[[ATTR5]] {
1558
+ ; TUNIT-NEXT: [[C:%.*]] = call ptr @phi(ptr noalias nofree readnone [[P]]) #[[ATTR19:[0-9]+]]
1559
+ ; TUNIT-NEXT: call void @use_i8_ptr(ptr noalias nocapture nofree readnone [[C]]) #[[ATTR5]]
1560
+ ; TUNIT-NEXT: ret void
1561
+ ;
1562
+ ; CGSCC: Function Attrs: nounwind
1563
+ ; CGSCC-LABEL: define {{[^@]+}}@phi_caller
1564
+ ; CGSCC-SAME: (ptr nofree [[P:%.*]]) #[[ATTR4]] {
1565
+ ; CGSCC-NEXT: [[C:%.*]] = call ptr @phi(ptr noalias nofree readnone [[P]]) #[[ATTR15]]
1566
+ ; CGSCC-NEXT: call void @use_i8_ptr(ptr noalias nocapture nofree readnone [[C]]) #[[ATTR4]]
1567
+ ; CGSCC-NEXT: ret void
1568
+ ;
1569
+ %c = call ptr @phi (ptr %p )
1570
+ call void @use_i8_ptr (ptr %c )
1571
+ ret void
1572
+ }
1573
+
1574
+ define ptr @multi_ret (ptr %p ) {
1575
+ ; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
1576
+ ; CHECK-LABEL: define {{[^@]+}}@multi_ret
1577
+ ; CHECK-SAME: (ptr nofree readnone [[P:%.*]]) #[[ATTR1]] {
1578
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P]], null
1579
+ ; CHECK-NEXT: br i1 [[C]], label [[NULL:%.*]], label [[NNULL:%.*]]
1580
+ ; CHECK: NNULL:
1581
+ ; CHECK-NEXT: ret ptr [[P]]
1582
+ ; CHECK: NULL:
1583
+ ; CHECK-NEXT: [[G:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 1
1584
+ ; CHECK-NEXT: ret ptr [[G]]
1585
+ ;
1586
+ %c = icmp eq ptr %p , null
1587
+ br i1 %c , label %NULL , label %NNULL
1588
+ NNULL:
1589
+ ret ptr %p
1590
+ NULL:
1591
+ %g = getelementptr inbounds i8 , ptr %p , i64 1
1592
+ ret ptr %g
1593
+ }
1594
+ define void @multi_ret_caller (ptr %p ) {
1595
+ ; TUNIT: Function Attrs: nounwind
1596
+ ; TUNIT-LABEL: define {{[^@]+}}@multi_ret_caller
1597
+ ; TUNIT-SAME: (ptr nofree [[P:%.*]]) #[[ATTR5]] {
1598
+ ; TUNIT-NEXT: [[C:%.*]] = call ptr @multi_ret(ptr noalias nofree readnone [[P]]) #[[ATTR19]]
1599
+ ; TUNIT-NEXT: call void @use_i8_ptr(ptr noalias nocapture nofree readnone [[C]]) #[[ATTR5]]
1600
+ ; TUNIT-NEXT: ret void
1601
+ ;
1602
+ ; CGSCC: Function Attrs: nounwind
1603
+ ; CGSCC-LABEL: define {{[^@]+}}@multi_ret_caller
1604
+ ; CGSCC-SAME: (ptr nofree [[P:%.*]]) #[[ATTR4]] {
1605
+ ; CGSCC-NEXT: [[C:%.*]] = call ptr @multi_ret(ptr noalias nofree readnone [[P]]) #[[ATTR15]]
1606
+ ; CGSCC-NEXT: call void @use_i8_ptr(ptr noalias nocapture nofree readnone [[C]]) #[[ATTR4]]
1607
+ ; CGSCC-NEXT: ret void
1608
+ ;
1609
+ %c = call ptr @multi_ret (ptr %p )
1610
+ call void @use_i8_ptr (ptr %c )
1611
+ ret void
1612
+ }
1613
+
1528
1614
attributes #0 = { null_pointer_is_valid }
1529
1615
attributes #1 = { nounwind willreturn}
1530
1616
;.
@@ -1547,6 +1633,7 @@ attributes #1 = { nounwind willreturn}
1547
1633
; TUNIT: attributes #[[ATTR16]] = { nofree nosync nounwind memory(read) }
1548
1634
; TUNIT: attributes #[[ATTR17]] = { nosync willreturn memory(read) }
1549
1635
; TUNIT: attributes #[[ATTR18]] = { nofree nosync willreturn memory(read) }
1636
+ ; TUNIT: attributes #[[ATTR19]] = { nofree nosync nounwind willreturn memory(none) }
1550
1637
;.
1551
1638
; CGSCC: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) }
1552
1639
; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }
0 commit comments