Skip to content

Commit 94f3b22

Browse files
Merge pull request #70997 from nate-chandler/alias-analysis-builtin
[AliasAnalysis] Improve builtin's effects to depend on escapingness.
2 parents fca9747 + 75ccbae commit 94f3b22

File tree

3 files changed

+45
-1
lines changed

3 files changed

+45
-1
lines changed

SwiftCompilerSources/Sources/Optimizer/Analysis/AliasAnalysis.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,10 @@ private func getMemoryEffect(ofBuiltin builtin: BuiltinInst, for address: Value,
159159
let callee = builtin.operands[1].value
160160
return context.calleeAnalysis.getSideEffects(ofCallee: callee).memory
161161
default:
162-
return builtin.memoryEffects
162+
if address.at(path).isEscaping(using: EscapesToInstructionVisitor(target: builtin, isAddress: true), context) {
163+
return builtin.memoryEffects
164+
}
165+
return SideEffects.Memory()
163166
}
164167
}
165168

test/SILOptimizer/mem-behavior.sil

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,3 +1076,25 @@ bb0(%0 : $*C, %1 : $*C, %2 : @owned $C):
10761076
return %r : $()
10771077
}
10781078

1079+
// CHECK-LABEL: @test_builtin_zeroInitializer
1080+
// CHECK: PAIR #0.
1081+
// CHECK-NEXT: %2 = builtin "zeroInitializer"<C>(%1 : $*C)
1082+
// CHECK-NEXT: %0 = alloc_stack
1083+
// CHECK-NEXT: r=0,w=0
1084+
// CHECK: PAIR #1.
1085+
// CHECK-NEXT: %2 = builtin "zeroInitializer"<C>(%1 : $*C)
1086+
// CHECK-NEXT: %1 = alloc_stack
1087+
// CHECK-NEXT: r=0,w=1
1088+
sil @test_builtin_zeroInitializer : $@convention(thin) () -> () {
1089+
bb0:
1090+
%0 = alloc_stack $C
1091+
%1 = alloc_stack $C
1092+
%2 = builtin "zeroInitializer"<C>(%1 : $*C) : $()
1093+
%3 = apply undef<C>(%1) : $@convention(thin) <C> () -> @out C
1094+
copy_addr [take] %1 to [init] %0 : $*C
1095+
dealloc_stack %1 : $*C
1096+
destroy_addr %0 : $*C
1097+
dealloc_stack %0 : $*C
1098+
%4 = tuple ()
1099+
return %4 : $()
1100+
}

test/SILOptimizer/templvalueopt.sil

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import Swift
44
import Builtin
55

6+
// REQUIRES: swift_in_compiler
7+
68
// CHECK-LABEL: sil @test_enum_with_initialize :
79
// CHECK: bb0(%0 : $*Optional<Any>, %1 : $*Any):
810
// CHECK-NEXT: [[E:%[0-9]+]] = init_enum_data_addr %0
@@ -249,3 +251,20 @@ bb0(%0 : $*T, %1 : $*T):
249251
return %78 : $()
250252
}
251253

254+
255+
// CHECK-LABEL: sil @optimize_builtin_zeroInitialize : {{.*}} {
256+
// CHECK: bb0([[RET_ADDR:%[^,]+]] :
257+
// CHECK: builtin "zeroInitializer"<T>([[RET_ADDR]] : $*T) : $()
258+
// CHECK: apply undef<T>([[RET_ADDR]])
259+
// CHECK-LABEL: } // end sil function 'optimize_builtin_zeroInitialize'
260+
sil @optimize_builtin_zeroInitialize : $@convention(thin) <T> () -> @out T {
261+
bb0(%ret_addr : $*T):
262+
%temporary = alloc_stack [lexical] $T
263+
builtin "zeroInitializer"<T>(%temporary : $*T) : $()
264+
apply undef<T>(%temporary) : $@convention(thin) <T> () -> @out T
265+
copy_addr [take] %temporary to [init] %ret_addr : $*T
266+
dealloc_stack %temporary : $*T
267+
%15 = tuple ()
268+
return %15 : $()
269+
}
270+

0 commit comments

Comments
 (0)