@@ -68,18 +68,14 @@ define internal i32 @test_cannot_promote_3(ptr %p, ptr nocapture readonly %test_
6868 ret i32 %sum
6969}
7070
71- ; FIXME: We should perform ArgPromotion here!
72- ;
7371; This is called only by @caller_safe_args_1, from which we can prove that
7472; %test_c does not alias %p for any Call to the function, so we can promote it.
7573;
7674define internal i32 @test_can_promote_1 (ptr %p , ptr nocapture readonly %test_c ) {
7775; CHECK-LABEL: define {{[^@]+}}@test_can_promote_1
78- ; CHECK-SAME: (ptr [[P:%.*]], ptr nocapture readonly [[TEST_C:%.*]]) {
79- ; CHECK-NEXT: [[TEST_C_VAL:%.*]] = load i32, ptr [[TEST_C]], align 4
80- ; CHECK-NEXT: [[RES:%.*]] = call i32 @callee(ptr [[P]], i32 [[TEST_C_VAL]])
81- ; CHECK-NEXT: [[LTEST_C:%.*]] = load i32, ptr [[TEST_C]], align 4
82- ; CHECK-NEXT: [[SUM:%.*]] = add i32 [[LTEST_C]], [[RES]]
76+ ; CHECK-SAME: (ptr [[P:%.*]], i32 [[TEST_C_0_VAL:%.*]]) {
77+ ; CHECK-NEXT: [[RES:%.*]] = call i32 @callee(ptr [[P]], i32 [[TEST_C_0_VAL]])
78+ ; CHECK-NEXT: [[SUM:%.*]] = add i32 [[TEST_C_0_VAL]], [[RES]]
8379; CHECK-NEXT: ret i32 [[SUM]]
8480;
8581 %res = call i32 @callee (ptr %p , ptr %test_c )
@@ -91,19 +87,15 @@ define internal i32 @test_can_promote_1(ptr %p, ptr nocapture readonly %test_c)
9187 ret i32 %sum
9288}
9389
94- ; FIXME: We should perform ArgPromotion here!
95- ;
9690; This is called by multiple callers (@caller_safe_args_1, @caller_safe_args_2),
9791; from which we can prove that %test_c does not alias %p for any Call to the
9892; function, so we can promote it.
9993;
10094define internal i32 @test_can_promote_2 (ptr %p , ptr nocapture readonly %test_c ) {
10195; CHECK-LABEL: define {{[^@]+}}@test_can_promote_2
102- ; CHECK-SAME: (ptr [[P:%.*]], ptr nocapture readonly [[TEST_C:%.*]]) {
103- ; CHECK-NEXT: [[TEST_C_VAL:%.*]] = load i32, ptr [[TEST_C]], align 4
104- ; CHECK-NEXT: [[RES:%.*]] = call i32 @callee(ptr [[P]], i32 [[TEST_C_VAL]])
105- ; CHECK-NEXT: [[LTEST_C:%.*]] = load i32, ptr [[TEST_C]], align 4
106- ; CHECK-NEXT: [[SUM:%.*]] = add i32 [[LTEST_C]], [[RES]]
96+ ; CHECK-SAME: (ptr [[P:%.*]], i32 [[TEST_C_0_VAL:%.*]]) {
97+ ; CHECK-NEXT: [[RES:%.*]] = call i32 @callee(ptr [[P]], i32 [[TEST_C_0_VAL]])
98+ ; CHECK-NEXT: [[SUM:%.*]] = add i32 [[TEST_C_0_VAL]], [[RES]]
10799; CHECK-NEXT: ret i32 [[SUM]]
108100;
109101 %res = call i32 @callee (ptr %p , ptr %test_c )
@@ -186,8 +178,10 @@ define i32 @caller_safe_args_1(i64 %n) {
186178; CHECK-NEXT: [[CALLER_C:%.*]] = alloca i32, align 4
187179; CHECK-NEXT: store i32 5, ptr [[CALLER_C]], align 4
188180; CHECK-NEXT: [[RES1:%.*]] = call i32 @test_cannot_promote_3(ptr [[P]], ptr [[CALLER_C]])
189- ; CHECK-NEXT: [[RES2:%.*]] = call i32 @test_can_promote_1(ptr [[P]], ptr [[CALLER_C]])
190- ; CHECK-NEXT: [[RES3:%.*]] = call i32 @test_can_promote_2(ptr [[P]], ptr [[CALLER_C]])
181+ ; CHECK-NEXT: [[CALLER_C_VAL:%.*]] = load i32, ptr [[CALLER_C]], align 4
182+ ; CHECK-NEXT: [[RES2:%.*]] = call i32 @test_can_promote_1(ptr [[P]], i32 [[CALLER_C_VAL]])
183+ ; CHECK-NEXT: [[CALLER_C_VAL1:%.*]] = load i32, ptr [[CALLER_C]], align 4
184+ ; CHECK-NEXT: [[RES3:%.*]] = call i32 @test_can_promote_2(ptr [[P]], i32 [[CALLER_C_VAL1]])
191185; CHECK-NEXT: [[RES12:%.*]] = add i32 [[RES1]], [[RES2]]
192186; CHECK-NEXT: [[RES:%.*]] = add i32 [[RES12]], [[RES3]]
193187; CHECK-NEXT: ret i32 [[RES]]
@@ -215,7 +209,8 @@ define i32 @caller_safe_args_2(i64 %n, ptr %p) {
215209; CHECK-NEXT: call void @memset(ptr [[P]], i64 0, i64 [[N]])
216210; CHECK-NEXT: [[CALLER_C:%.*]] = alloca i32, align 4
217211; CHECK-NEXT: store i32 5, ptr [[CALLER_C]], align 4
218- ; CHECK-NEXT: [[RES:%.*]] = call i32 @test_can_promote_2(ptr [[P]], ptr [[CALLER_C]])
212+ ; CHECK-NEXT: [[CALLER_C_VAL:%.*]] = load i32, ptr [[CALLER_C]], align 4
213+ ; CHECK-NEXT: [[RES:%.*]] = call i32 @test_can_promote_2(ptr [[P]], i32 [[CALLER_C_VAL]])
219214; CHECK-NEXT: ret i32 [[RES]]
220215;
221216 call void @memset (ptr %p , i64 0 , i64 %n )
0 commit comments