Skip to content

Commit 20c63cc

Browse files
committed
libswift: add AliasAnalysis
1 parent b175436 commit 20c63cc

File tree

8 files changed

+102
-2
lines changed

8 files changed

+102
-2
lines changed

include/swift/SILOptimizer/OptimizerBridging.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,26 @@ typedef struct {
2929
BridgedPassContext passContext;
3030
} BridgedInstructionPassCtxt;
3131

32-
typedef void (*BridgedFunctionPassRunFn)(BridgedFunctionPassCtxt);
33-
typedef void (*BridgedInstructionPassRunFn)(BridgedInstructionPassCtxt);
32+
typedef struct {
33+
const void * _Nonnull aliasAnalysis;
34+
} BridgedAliasAnalysis;
35+
36+
typedef void (* _Nonnull BridgedFunctionPassRunFn)(BridgedFunctionPassCtxt);
37+
typedef void (* _Nonnull BridgedInstructionPassRunFn)(BridgedInstructionPassCtxt);
3438

3539
void SILPassManager_registerFunctionPass(BridgedStringRef name,
3640
BridgedFunctionPassRunFn runFn);
3741

3842
void SILCombine_registerInstructionPass(BridgedStringRef name,
3943
BridgedInstructionPassRunFn runFn);
4044

45+
BridgedAliasAnalysis PassContext_getAliasAnalysis(BridgedPassContext context,
46+
BridgedFunction function);
47+
48+
BridgedMemoryBehavior AliasAnalysis_getMemBehavior(BridgedAliasAnalysis aa,
49+
BridgedInstruction inst,
50+
BridgedValue addr);
51+
4152
#ifdef __cplusplus
4253
} // extern "C"
4354
#endif

include/swift/SILOptimizer/PassManager/PassManager.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ class LibswiftPassInvocation {
5959
LibswiftPassInvocation(SILPassManager *passManager, SILCombiner *silCombiner) :
6060
passManager(passManager), silCombiner(silCombiner) {}
6161

62+
SILPassManager *getPassManager() const { return passManager; }
63+
6264
FixedSizeSlab *allocSlab(FixedSizeSlab *afterSlab);
6365

6466
FixedSizeSlab *freeSlab(FixedSizeSlab *slab);

lib/SILOptimizer/Analysis/AliasAnalysis.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#define DEBUG_TYPE "sil-aa"
1414
#include "swift/SILOptimizer/Analysis/AliasAnalysis.h"
15+
#include "swift/SIL/SILBridgingUtils.h"
1516
#include "swift/SIL/InstructionUtils.h"
1617
#include "swift/SIL/Projection.h"
1718
#include "swift/SIL/SILArgument.h"
@@ -27,6 +28,7 @@
2728
#include "llvm/Support/CommandLine.h"
2829
#include "llvm/Support/Debug.h"
2930
#include "llvm/Support/raw_ostream.h"
31+
#include "swift/SILOptimizer/OptimizerBridging.h"
3032

3133
using namespace swift;
3234

@@ -808,3 +810,19 @@ class AliasAnalysisContainer : public FunctionAnalysisBase<AliasAnalysis> {
808810
SILAnalysis *swift::createAliasAnalysis(SILModule *M) {
809811
return new AliasAnalysisContainer();
810812
}
813+
814+
//===----------------------------------------------------------------------===//
815+
// Swift Bridging
816+
//===----------------------------------------------------------------------===//
817+
818+
inline AliasAnalysis *castToAliasAnalysis(BridgedAliasAnalysis aa) {
819+
return const_cast<AliasAnalysis *>(
820+
static_cast<const AliasAnalysis *>(aa.aliasAnalysis));
821+
}
822+
823+
BridgedMemoryBehavior AliasAnalysis_getMemBehavior(BridgedAliasAnalysis aa,
824+
BridgedInstruction inst,
825+
BridgedValue addr) {
826+
return (BridgedMemoryBehavior)castToAliasAnalysis(aa)->
827+
computeMemoryBehavior(castToInst(inst), castToSILValue(addr));
828+
}

lib/SILOptimizer/PassManager/PassManager.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "swift/SIL/SILBridgingUtils.h"
2020
#include "swift/SIL/SILFunction.h"
2121
#include "swift/SIL/SILModule.h"
22+
#include "swift/SILOptimizer/Analysis/AliasAnalysis.h"
2223
#include "swift/SILOptimizer/Analysis/BasicCalleeAnalysis.h"
2324
#include "swift/SILOptimizer/Analysis/FunctionOrder.h"
2425
#include "swift/SILOptimizer/OptimizerBridging.h"
@@ -1165,3 +1166,9 @@ void PassContext_eraseInstruction(BridgedPassContext passContext,
11651166
castToPassInvocation(passContext)->eraseInstruction(castToInst(inst));
11661167
}
11671168

1169+
BridgedAliasAnalysis PassContext_getAliasAnalysis(BridgedPassContext context,
1170+
BridgedFunction function) {
1171+
SILPassManager *pm = castToPassInvocation(context)->getPassManager();
1172+
return {pm->getAnalysis<AliasAnalysis>(castToFunction(function))};
1173+
}
1174+
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
//===--- AliasAnalysis.swift - the alias analysis -------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
import OptimizerBridging
14+
import SIL
15+
16+
struct AliasAnalysis {
17+
let bridged: BridgedAliasAnalysis
18+
19+
func mayRead(_ inst: Instruction, fromAddress: Value) -> Bool {
20+
switch AliasAnalysis_getMemBehavior(bridged, inst.bridged, fromAddress.bridged) {
21+
case MayReadBehavior, MayReadWriteBehavior, MayHaveSideEffectsBehavior:
22+
return true
23+
default:
24+
return false
25+
}
26+
}
27+
28+
func mayWrite(_ inst: Instruction, toAddress: Value) -> Bool {
29+
switch AliasAnalysis_getMemBehavior(bridged, inst.bridged, toAddress.bridged) {
30+
case MayWriteBehavior, MayReadWriteBehavior, MayHaveSideEffectsBehavior:
31+
return true
32+
default:
33+
return false
34+
}
35+
}
36+
37+
func mayReadOrWrite(_ inst: Instruction, address: Value) -> Bool {
38+
switch AliasAnalysis_getMemBehavior(bridged, inst.bridged, address.bridged) {
39+
case MayReadBehavior, MayWriteBehavior, MayReadWriteBehavior,
40+
MayHaveSideEffectsBehavior:
41+
return true
42+
default:
43+
return false
44+
}
45+
}
46+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# This source file is part of the Swift.org open source project
2+
#
3+
# Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors
4+
# Licensed under Apache License v2.0 with Runtime Library Exception
5+
#
6+
# See http://swift.org/LICENSE.txt for license information
7+
# See http://swift.org/CONTRIBUTORS.txt for Swift project authors
8+
9+
libswift_sources(Optimizer
10+
AliasAnalysis.swift)

libswift/Sources/Optimizer/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
add_libswift_module(Optimizer
1010
DEPENDS SIL)
1111

12+
add_subdirectory(Analysis)
1213
add_subdirectory(InstructionPasses)
1314
add_subdirectory(PassManager)
1415
add_subdirectory(FunctionPasses)

libswift/Sources/Optimizer/PassManager/PassUtils.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ struct FunctionPassContext {
3030
private func notifyChanges(_ kind: ChangeNotificationKind) {
3131
PassContext_notifyChanges(passContext, kind)
3232
}
33+
34+
var aliasAnalysis: AliasAnalysis {
35+
let bridgedAA = PassContext_getAliasAnalysis(passContext, function.bridged)
36+
return AliasAnalysis(bridged: bridgedAA)
37+
}
3338
}
3439

3540
struct FunctionPass {

0 commit comments

Comments
 (0)