1
1
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
2
- ; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=9 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
3
- ; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=9 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
2
+ ; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=10 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
3
+ ; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=10 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
4
4
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
5
5
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
6
6
@@ -408,13 +408,13 @@ define i32* @test10a(i32* align 32 %p) {
408
408
; NOT_CGSCC_OPM-NEXT: [[C:%.*]] = icmp eq i32 [[L]], 0
409
409
; NOT_CGSCC_OPM-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
410
410
; NOT_CGSCC_OPM: t:
411
- ; NOT_CGSCC_OPM-NEXT: [[R:%.*]] = call i32* @test10a(i32* nofree nonnull align 32 dereferenceable(4) "no-capture-maybe-returned" [[P]]) [[ATTR3]]
412
- ; NOT_CGSCC_OPM-NEXT: store i32 1, i32* [[R]], align 4
411
+ ; NOT_CGSCC_OPM-NEXT: [[R:%.*]] = call align 32 i32* @test10a(i32* nofree nonnull align 32 dereferenceable(4) "no-capture-maybe-returned" [[P]]) [[ATTR3]]
412
+ ; NOT_CGSCC_OPM-NEXT: store i32 1, i32* [[R]], align 32
413
413
; NOT_CGSCC_OPM-NEXT: [[G0:%.*]] = getelementptr i32, i32* [[P]], i32 8
414
414
; NOT_CGSCC_OPM-NEXT: br label [[E:%.*]]
415
415
; NOT_CGSCC_OPM: f:
416
416
; NOT_CGSCC_OPM-NEXT: [[G1:%.*]] = getelementptr i32, i32* [[P]], i32 8
417
- ; NOT_CGSCC_OPM-NEXT: store i32 -1, i32* [[G1]], align 4
417
+ ; NOT_CGSCC_OPM-NEXT: store i32 -1, i32* [[G1]], align 32
418
418
; NOT_CGSCC_OPM-NEXT: br label [[E]]
419
419
; NOT_CGSCC_OPM: e:
420
420
; NOT_CGSCC_OPM-NEXT: [[PHI:%.*]] = phi i32* [ [[G0]], [[T]] ], [ [[G1]], [[F]] ]
@@ -427,13 +427,13 @@ define i32* @test10a(i32* align 32 %p) {
427
427
; IS__CGSCC_OPM-NEXT: [[C:%.*]] = icmp eq i32 [[L]], 0
428
428
; IS__CGSCC_OPM-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
429
429
; IS__CGSCC_OPM: t:
430
- ; IS__CGSCC_OPM-NEXT: [[R:%.*]] = call i32* @test10a(i32* nofree nonnull align 32 dereferenceable(4) "no-capture-maybe-returned" [[P]]) [[ATTR4]]
431
- ; IS__CGSCC_OPM-NEXT: store i32 1, i32* [[R]], align 4
430
+ ; IS__CGSCC_OPM-NEXT: [[R:%.*]] = call align 32 i32* @test10a(i32* nofree nonnull align 32 dereferenceable(4) "no-capture-maybe-returned" [[P]]) [[ATTR4]]
431
+ ; IS__CGSCC_OPM-NEXT: store i32 1, i32* [[R]], align 32
432
432
; IS__CGSCC_OPM-NEXT: [[G0:%.*]] = getelementptr i32, i32* [[P]], i32 8
433
433
; IS__CGSCC_OPM-NEXT: br label [[E:%.*]]
434
434
; IS__CGSCC_OPM: f:
435
435
; IS__CGSCC_OPM-NEXT: [[G1:%.*]] = getelementptr i32, i32* [[P]], i32 8
436
- ; IS__CGSCC_OPM-NEXT: store i32 -1, i32* [[G1]], align 4
436
+ ; IS__CGSCC_OPM-NEXT: store i32 -1, i32* [[G1]], align 32
437
437
; IS__CGSCC_OPM-NEXT: br label [[E]]
438
438
; IS__CGSCC_OPM: e:
439
439
; IS__CGSCC_OPM-NEXT: [[PHI:%.*]] = phi i32* [ [[G0]], [[T]] ], [ [[G1]], [[F]] ]
@@ -470,13 +470,13 @@ define i32* @test10b(i32* align 32 %p) {
470
470
; NOT_CGSCC_OPM-NEXT: [[C:%.*]] = icmp eq i32 [[L]], 0
471
471
; NOT_CGSCC_OPM-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
472
472
; NOT_CGSCC_OPM: t:
473
- ; NOT_CGSCC_OPM-NEXT: [[R:%.*]] = call i32* @test10b(i32* nofree nonnull align 32 dereferenceable(4) "no-capture-maybe-returned" [[P]]) [[ATTR3]]
474
- ; NOT_CGSCC_OPM-NEXT: store i32 1, i32* [[R]], align 4
473
+ ; NOT_CGSCC_OPM-NEXT: [[R:%.*]] = call align 32 i32* @test10b(i32* nofree nonnull align 32 dereferenceable(4) "no-capture-maybe-returned" [[P]]) [[ATTR3]]
474
+ ; NOT_CGSCC_OPM-NEXT: store i32 1, i32* [[R]], align 32
475
475
; NOT_CGSCC_OPM-NEXT: [[G0:%.*]] = getelementptr i32, i32* [[P]], i32 8
476
476
; NOT_CGSCC_OPM-NEXT: br label [[E:%.*]]
477
477
; NOT_CGSCC_OPM: f:
478
478
; NOT_CGSCC_OPM-NEXT: [[G1:%.*]] = getelementptr i32, i32* [[P]], i32 -8
479
- ; NOT_CGSCC_OPM-NEXT: store i32 -1, i32* [[G1]], align 4
479
+ ; NOT_CGSCC_OPM-NEXT: store i32 -1, i32* [[G1]], align 32
480
480
; NOT_CGSCC_OPM-NEXT: br label [[E]]
481
481
; NOT_CGSCC_OPM: e:
482
482
; NOT_CGSCC_OPM-NEXT: [[PHI:%.*]] = phi i32* [ [[G0]], [[T]] ], [ [[G1]], [[F]] ]
@@ -489,13 +489,13 @@ define i32* @test10b(i32* align 32 %p) {
489
489
; IS__CGSCC_OPM-NEXT: [[C:%.*]] = icmp eq i32 [[L]], 0
490
490
; IS__CGSCC_OPM-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
491
491
; IS__CGSCC_OPM: t:
492
- ; IS__CGSCC_OPM-NEXT: [[R:%.*]] = call i32* @test10b(i32* nofree nonnull align 32 dereferenceable(4) "no-capture-maybe-returned" [[P]]) [[ATTR4]]
493
- ; IS__CGSCC_OPM-NEXT: store i32 1, i32* [[R]], align 4
492
+ ; IS__CGSCC_OPM-NEXT: [[R:%.*]] = call align 32 i32* @test10b(i32* nofree nonnull align 32 dereferenceable(4) "no-capture-maybe-returned" [[P]]) [[ATTR4]]
493
+ ; IS__CGSCC_OPM-NEXT: store i32 1, i32* [[R]], align 32
494
494
; IS__CGSCC_OPM-NEXT: [[G0:%.*]] = getelementptr i32, i32* [[P]], i32 8
495
495
; IS__CGSCC_OPM-NEXT: br label [[E:%.*]]
496
496
; IS__CGSCC_OPM: f:
497
497
; IS__CGSCC_OPM-NEXT: [[G1:%.*]] = getelementptr i32, i32* [[P]], i32 -8
498
- ; IS__CGSCC_OPM-NEXT: store i32 -1, i32* [[G1]], align 4
498
+ ; IS__CGSCC_OPM-NEXT: store i32 -1, i32* [[G1]], align 32
499
499
; IS__CGSCC_OPM-NEXT: br label [[E]]
500
500
; IS__CGSCC_OPM: e:
501
501
; IS__CGSCC_OPM-NEXT: [[PHI:%.*]] = phi i32* [ [[G0]], [[T]] ], [ [[G1]], [[F]] ]
@@ -992,6 +992,56 @@ exit:
992
992
ret i32 0
993
993
}
994
994
995
+ define i32* @checkAndAdvance (i32* align (16 ) %p ) {
996
+ ; NOT_CGSCC_OPM: Function Attrs: nounwind
997
+ ; NOT_CGSCC_OPM-LABEL: define {{[^@]+}}@checkAndAdvance
998
+ ; NOT_CGSCC_OPM-SAME: (i32* nonnull readonly align 16 dereferenceable(4) "no-capture-maybe-returned" [[P:%.*]]) [[ATTR2]] {
999
+ ; NOT_CGSCC_OPM-NEXT: entry:
1000
+ ; NOT_CGSCC_OPM-NEXT: [[TMP0:%.*]] = load i32, i32* [[P]], align 16
1001
+ ; NOT_CGSCC_OPM-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], 0
1002
+ ; NOT_CGSCC_OPM-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[RETURN:%.*]]
1003
+ ; NOT_CGSCC_OPM: if.then:
1004
+ ; NOT_CGSCC_OPM-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, i32* [[P]], i64 4
1005
+ ; NOT_CGSCC_OPM-NEXT: [[CALL:%.*]] = call nonnull align 16 i32* @checkAndAdvance(i32* nonnull readonly align 16 "no-capture-maybe-returned" [[ADD_PTR]]) [[ATTR2]]
1006
+ ; NOT_CGSCC_OPM-NEXT: br label [[RETURN]]
1007
+ ; NOT_CGSCC_OPM: return:
1008
+ ; NOT_CGSCC_OPM-NEXT: [[RETVAL_0:%.*]] = phi i32* [ [[CALL]], [[IF_THEN]] ], [ [[P]], [[ENTRY:%.*]] ]
1009
+ ; NOT_CGSCC_OPM-NEXT: call void @user_i32_ptr(i32* noalias nocapture nonnull readnone align 16 [[RETVAL_0]]) [[ATTR2]]
1010
+ ; NOT_CGSCC_OPM-NEXT: ret i32* [[RETVAL_0]]
1011
+ ;
1012
+ ; IS__CGSCC_OPM: Function Attrs: nounwind
1013
+ ; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@checkAndAdvance
1014
+ ; IS__CGSCC_OPM-SAME: (i32* nonnull readonly align 16 dereferenceable(4) "no-capture-maybe-returned" [[P:%.*]]) [[ATTR3]] {
1015
+ ; IS__CGSCC_OPM-NEXT: entry:
1016
+ ; IS__CGSCC_OPM-NEXT: [[TMP0:%.*]] = load i32, i32* [[P]], align 16
1017
+ ; IS__CGSCC_OPM-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], 0
1018
+ ; IS__CGSCC_OPM-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[RETURN:%.*]]
1019
+ ; IS__CGSCC_OPM: if.then:
1020
+ ; IS__CGSCC_OPM-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, i32* [[P]], i64 4
1021
+ ; IS__CGSCC_OPM-NEXT: [[CALL:%.*]] = call nonnull align 16 i32* @checkAndAdvance(i32* nonnull readonly align 16 "no-capture-maybe-returned" [[ADD_PTR]]) [[ATTR3]]
1022
+ ; IS__CGSCC_OPM-NEXT: br label [[RETURN]]
1023
+ ; IS__CGSCC_OPM: return:
1024
+ ; IS__CGSCC_OPM-NEXT: [[RETVAL_0:%.*]] = phi i32* [ [[CALL]], [[IF_THEN]] ], [ [[P]], [[ENTRY:%.*]] ]
1025
+ ; IS__CGSCC_OPM-NEXT: call void @user_i32_ptr(i32* noalias nocapture nonnull readnone align 16 [[RETVAL_0]]) [[ATTR3]]
1026
+ ; IS__CGSCC_OPM-NEXT: ret i32* [[RETVAL_0]]
1027
+ ;
1028
+ entry:
1029
+ %0 = load i32 , i32* %p , align 4
1030
+ %cmp = icmp eq i32 %0 , 0
1031
+ br i1 %cmp , label %if.then , label %return
1032
+
1033
+ if.then: ; preds = %entry
1034
+ %add.ptr = getelementptr inbounds i32 , i32* %p , i64 4
1035
+ %call = call i32* @checkAndAdvance (i32* nonnull %add.ptr )
1036
+ br label %return
1037
+
1038
+ return: ; preds = %entry, %if.then
1039
+ %retval.0 = phi i32* [ %call , %if.then ], [ %p , %entry ]
1040
+ call void @user_i32_ptr (i32* %retval.0 )
1041
+ ret i32* %retval.0
1042
+ }
1043
+
1044
+
995
1045
attributes #0 = { nounwind uwtable noinline }
996
1046
attributes #1 = { uwtable noinline }
997
1047
attributes #2 = { null_pointer_is_valid }
0 commit comments