Skip to content

Commit 692db6d

Browse files
committed
SideEffectAnalysis: ignore _swift_stdlib_malloc_size and _swift_stdlib_has_malloc_size runtime calls
Those runtime calls are used in the Array implementation and prevented optimizations like redundant load elimination.
1 parent 96f16e0 commit 692db6d

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

lib/SILOptimizer/Analysis/SideEffectAnalysis.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,12 @@ bool FunctionSideEffects::summarizeCall(FullApplySite fullApply) {
498498
// Does the function have any @_effects?
499499
if (setDefinedEffects(SingleCallee))
500500
return true;
501+
502+
if (SingleCallee->getName() == "_swift_stdlib_malloc_size" ||
503+
SingleCallee->getName() == "_swift_stdlib_has_malloc_size") {
504+
GlobalEffects.Reads = true;
505+
return true;
506+
}
501507
}
502508
return false;
503509
}

test/SILOptimizer/redundant_load_elim_ossa.sil

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ sil_stage canonical
55

66
import Builtin
77
import Swift
8+
import SwiftShims
89

910
///////////////////////
1011
// Type Declarations //
@@ -1348,6 +1349,29 @@ bb0(%0 : $*Int):
13481349
}
13491350
// CHECK-LABEL: } // end sil function 'test_rle_in_guaranteed_entry'
13501351

1352+
sil shared [clang _swift_stdlib_has_malloc_size] @_swift_stdlib_has_malloc_size : $@convention(c) () -> Bool
1353+
sil shared [clang _swift_stdlib_malloc_size] @_swift_stdlib_malloc_size : $@convention(c) (UnsafeRawPointer) -> Int
1354+
1355+
// CHECK-LABEL: sil [ossa] @ignoreMallocSize :
1356+
// CHECK: [[VAL:%.*]] = load
1357+
// CHECK: [[UI:%.*]] = function_ref @use_Int
1358+
// CHECK: apply [[UI]]([[VAL]])
1359+
// CHECK: return [[VAL]]
1360+
// CHECK-LABEL: } // end sil function 'ignoreMallocSize'
1361+
sil [ossa] @ignoreMallocSize : $@convention(thin) (@guaranteed AB, UnsafeRawPointer) -> Int {
1362+
bb0(%0 : @guaranteed $AB, %1 : $UnsafeRawPointer):
1363+
%2 = ref_element_addr %0 : $AB, #AB.value
1364+
%3 = load [trivial] %2 : $*Int
1365+
%4 = function_ref @_swift_stdlib_has_malloc_size : $@convention(c) () -> Bool
1366+
%5 = apply %4() : $@convention(c) () -> Bool
1367+
%6 = function_ref @_swift_stdlib_malloc_size : $@convention(c) (UnsafeRawPointer) -> Int
1368+
%7 = apply %6(%1) : $@convention(c) (UnsafeRawPointer) -> Int
1369+
%8 = load [trivial] %2 : $*Int
1370+
%9 = function_ref @use_Int : $@convention(thin) (Int) -> ()
1371+
apply %9(%3) : $@convention(thin) (Int) -> ()
1372+
return %8 : $Int
1373+
}
1374+
13511375
// Check that begin_access, end_access, strong_release, set_deallocating, and dealloc_ref don't prevent optimization.
13521376
// CHECK-LABEL: ignore_read_write :
13531377
// CHECK: bb0

0 commit comments

Comments
 (0)