@@ -68,18 +68,14 @@ define internal i32 @test_cannot_promote_3(ptr %p, ptr nocapture readonly %test_
68
68
ret i32 %sum
69
69
}
70
70
71
- ; FIXME: We should perform ArgPromotion here!
72
- ;
73
71
; This is called only by @caller_safe_args_1, from which we can prove that
74
72
; %test_c does not alias %p for any Call to the function, so we can promote it.
75
73
;
76
74
define internal i32 @test_can_promote_1 (ptr %p , ptr nocapture readonly %test_c ) {
77
75
; 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]]
83
79
; CHECK-NEXT: ret i32 [[SUM]]
84
80
;
85
81
%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)
91
87
ret i32 %sum
92
88
}
93
89
94
- ; FIXME: We should perform ArgPromotion here!
95
- ;
96
90
; This is called by multiple callers (@caller_safe_args_1, @caller_safe_args_2),
97
91
; from which we can prove that %test_c does not alias %p for any Call to the
98
92
; function, so we can promote it.
99
93
;
100
94
define internal i32 @test_can_promote_2 (ptr %p , ptr nocapture readonly %test_c ) {
101
95
; 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]]
107
99
; CHECK-NEXT: ret i32 [[SUM]]
108
100
;
109
101
%res = call i32 @callee (ptr %p , ptr %test_c )
@@ -186,8 +178,10 @@ define i32 @caller_safe_args_1(i64 %n) {
186
178
; CHECK-NEXT: [[CALLER_C:%.*]] = alloca i32, align 4
187
179
; CHECK-NEXT: store i32 5, ptr [[CALLER_C]], align 4
188
180
; 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]])
191
185
; CHECK-NEXT: [[RES12:%.*]] = add i32 [[RES1]], [[RES2]]
192
186
; CHECK-NEXT: [[RES:%.*]] = add i32 [[RES12]], [[RES3]]
193
187
; CHECK-NEXT: ret i32 [[RES]]
@@ -215,7 +209,8 @@ define i32 @caller_safe_args_2(i64 %n, ptr %p) {
215
209
; CHECK-NEXT: call void @memset(ptr [[P]], i64 0, i64 [[N]])
216
210
; CHECK-NEXT: [[CALLER_C:%.*]] = alloca i32, align 4
217
211
; 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]])
219
214
; CHECK-NEXT: ret i32 [[RES]]
220
215
;
221
216
call void @memset (ptr %p , i64 0 , i64 %n )
0 commit comments