@@ -1411,7 +1411,7 @@ exit:
1411
1411
}
1412
1412
1413
1413
; %a may be freeed between the dereferenceable assumption and accesses.
1414
- ; FIXME: It is not safe to use with -use-dereferenceable-at-point-semantics.
1414
+ ; It is not safe to use with -use-dereferenceable-at-point-semantics.
1415
1415
define void @may_free_align_deref_assumption_in_header_constant_trip_count_loop_invariant_ptr (ptr noalias %a , ptr noalias %b , ptr noalias %c ) {
1416
1416
; CHECK-LABEL: define void @may_free_align_deref_assumption_in_header_constant_trip_count_loop_invariant_ptr(
1417
1417
; CHECK-SAME: ptr noalias [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) {
@@ -1422,16 +1422,29 @@ define void @may_free_align_deref_assumption_in_header_constant_trip_count_loop_
1422
1422
; CHECK: [[VECTOR_PH]]:
1423
1423
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
1424
1424
; CHECK: [[VECTOR_BODY]]:
1425
- ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY ]] ]
1425
+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.* ]] ]
1426
1426
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0
1427
1427
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]
1428
1428
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i32 0
1429
1429
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP2]], align 4
1430
1430
; CHECK-NEXT: [[TMP3:%.*]] = icmp sge <2 x i32> [[WIDE_LOAD]], zeroinitializer
1431
- ; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[A]], align 4
1431
+ ; CHECK-NEXT: [[TMP4:%.*]] = xor <2 x i1> [[TMP3]], splat (i1 true)
1432
+ ; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x i1> [[TMP4]], i32 0
1433
+ ; CHECK-NEXT: br i1 [[TMP5]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]
1434
+ ; CHECK: [[PRED_LOAD_IF]]:
1432
1435
; CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[A]], align 4
1433
- ; CHECK-NEXT: [[TMP13:%.*]] = insertelement <2 x i32> poison, i32 [[TMP5]], i32 0
1434
- ; CHECK-NEXT: [[TMP11:%.*]] = insertelement <2 x i32> [[TMP13]], i32 [[TMP15]], i32 1
1436
+ ; CHECK-NEXT: [[TMP7:%.*]] = insertelement <2 x i32> poison, i32 [[TMP15]], i32 0
1437
+ ; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE]]
1438
+ ; CHECK: [[PRED_LOAD_CONTINUE]]:
1439
+ ; CHECK-NEXT: [[TMP12:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP7]], %[[PRED_LOAD_IF]] ]
1440
+ ; CHECK-NEXT: [[TMP13:%.*]] = extractelement <2 x i1> [[TMP4]], i32 1
1441
+ ; CHECK-NEXT: br i1 [[TMP13]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]
1442
+ ; CHECK: [[PRED_LOAD_IF1]]:
1443
+ ; CHECK-NEXT: [[TMP14:%.*]] = load i32, ptr [[A]], align 4
1444
+ ; CHECK-NEXT: [[TMP16:%.*]] = insertelement <2 x i32> [[TMP12]], i32 [[TMP14]], i32 1
1445
+ ; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE2]]
1446
+ ; CHECK: [[PRED_LOAD_CONTINUE2]]:
1447
+ ; CHECK-NEXT: [[TMP11:%.*]] = phi <2 x i32> [ [[TMP12]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP16]], %[[PRED_LOAD_IF1]] ]
1435
1448
; CHECK-NEXT: [[PREDPHI:%.*]] = select <2 x i1> [[TMP3]], <2 x i32> [[WIDE_LOAD]], <2 x i32> [[TMP11]]
1436
1449
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]
1437
1450
; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP8]], i32 0
0 commit comments