@@ -460,7 +460,7 @@ invoke.unwind:
460
460
define i32 @freeze_callbr_use_after_phi (i1 %c ) {
461
461
; CHECK-LABEL: @freeze_callbr_use_after_phi(
462
462
; CHECK-NEXT: entry:
463
- ; CHECK-NEXT: [[X:%.*]] = callbr i32 asm sideeffect "", "=r"() #[[ATTR1 :[0-9]+]]
463
+ ; CHECK-NEXT: [[X:%.*]] = callbr i32 asm sideeffect "", "=r"() #[[ATTR2 :[0-9]+]]
464
464
; CHECK-NEXT: to label [[CALLBR_CONT:%.*]] []
465
465
; CHECK: callbr.cont:
466
466
; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[X]], [[ENTRY:%.*]] ], [ 0, [[CALLBR_CONT]] ]
@@ -986,6 +986,40 @@ exit: ; preds = %loop
986
986
ret void
987
987
}
988
988
989
+ ; 'assume' says GEP ptr can't produce poison, check freeze is pushed to offset.
990
+ define void @fold_phi_gep_phi_offset_assume (ptr %init , ptr %end , i64 %n ) {
991
+ ; CHECK-LABEL: @fold_phi_gep_phi_offset_assume(
992
+ ; CHECK-NEXT: entry:
993
+ ; CHECK-NEXT: [[N:%.*]] = freeze i64 [[N1:%.*]]
994
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
995
+ ; CHECK: loop:
996
+ ; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[INIT:%.*]], [[ENTRY:%.*]] ], [ [[I_NEXT_FR:%.*]], [[LOOP]] ]
997
+ ; CHECK-NEXT: [[OFF:%.*]] = phi i64 [ [[N]], [[ENTRY]] ], [ [[OFF_NEXT:%.*]], [[LOOP]] ]
998
+ ; CHECK-NEXT: [[OFF_NEXT]] = shl i64 [[OFF]], 3
999
+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "noundef"(ptr [[I]]) ]
1000
+ ; CHECK-NEXT: [[I_NEXT_FR]] = getelementptr i8, ptr [[I]], i64 [[OFF_NEXT]]
1001
+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT_FR]], [[END:%.*]]
1002
+ ; CHECK-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
1003
+ ; CHECK: exit:
1004
+ ; CHECK-NEXT: ret void
1005
+ ;
1006
+ entry:
1007
+ br label %loop
1008
+
1009
+ loop: ; preds = %loop, %entry
1010
+ %i = phi ptr [ %init , %entry ], [ %i.next.fr , %loop ]
1011
+ %off = phi i64 [ %n , %entry ], [ %off.next , %loop ]
1012
+ %off.next = shl i64 %off , 3
1013
+ call void @llvm.assume (i1 true ) [ "noundef" (ptr %i ) ]
1014
+ %i.next = getelementptr inbounds i8 , ptr %i , i64 %off.next
1015
+ %i.next.fr = freeze ptr %i.next
1016
+ %cond = icmp eq ptr %i.next.fr , %end
1017
+ br i1 %cond , label %loop , label %exit
1018
+
1019
+ exit: ; preds = %loop
1020
+ ret void
1021
+ }
1022
+
989
1023
define void @fold_phi_multiple_insts (i32 %init , i32 %n ) {
990
1024
; CHECK-LABEL: @fold_phi_multiple_insts(
991
1025
; CHECK-NEXT: entry:
@@ -1346,7 +1380,8 @@ define ptr @freeze_ptrmask_nonnull(ptr %p, i64 noundef %m) {
1346
1380
!2 = !{i32 0 , i32 100 }
1347
1381
;.
1348
1382
; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
1349
- ; CHECK: attributes #[[ATTR1]] = { nounwind }
1383
+ ; CHECK: attributes #[[ATTR1:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) }
1384
+ ; CHECK: attributes #[[ATTR2]] = { nounwind }
1350
1385
;.
1351
1386
; CHECK: [[META0]] = !{}
1352
1387
; CHECK: [[META1]] = !{i64 4}
0 commit comments