diff options
author | Giorgis Georgakoudis <georgakoudis1@llnl.gov> | 2020-11-03 00:32:37 -0800 |
---|---|---|
committer | Giorgis Georgakoudis <georgakoudis1@llnl.gov> | 2020-11-05 17:01:08 -0800 |
commit | 700d2417d8281ea56dfd7ac72d1a1473d03d2d59 (patch) | |
tree | 6c19ae5713d1b8de5ece4fb39be83bbb1f214958 /clang/lib/Frontend/CompilerInvocation.cpp | |
parent | 65d15fefe3392b1db2f679b3df029d43d8d26d2d (diff) | |
download | llvm-700d2417d8281ea56dfd7ac72d1a1473d03d2d59.zip llvm-700d2417d8281ea56dfd7ac72d1a1473d03d2d59.tar.gz llvm-700d2417d8281ea56dfd7ac72d1a1473d03d2d59.tar.bz2 |
[CodeExtractor] Replace uses of extracted bitcasts in out-of-region lifetime markers
CodeExtractor handles bitcasts in the extracted region that have
lifetime markers users in the outer region as outputs. That
creates unnecessary alloca/reload instructions and extra lifetime
markers. The patch identifies those cases, and replaces uses in
out-of-region lifetime markers with new bitcasts in the outer region.
**Example**
```
define void @foo() {
entry:
%0 = alloca i32
br label %extract
extract:
%1 = bitcast i32* %0 to i8*
call void @llvm.lifetime.start.p0i8(i64 4, i8* %1)
call void @use(i32* %0)
br label %exit
exit:
call void @use(i32* %0)
call void @llvm.lifetime.end.p0i8(i64 4, i8* %1)
ret void
}
```
**Current extraction**
```
define void @foo() {
entry:
%.loc = alloca i8*, align 8
%0 = alloca i32, align 4
br label %codeRepl
codeRepl: ; preds = %entry
%lt.cast = bitcast i8** %.loc to i8*
call void @llvm.lifetime.start.p0i8(i64 -1, i8* %lt.cast)
%lt.cast1 = bitcast i32* %0 to i8*
call void @llvm.lifetime.start.p0i8(i64 -1, i8* %lt.cast1)
call void @foo.extract(i32* %0, i8** %.loc)
%.reload = load i8*, i8** %.loc, align 8
call void @llvm.lifetime.end.p0i8(i64 -1, i8* %lt.cast)
br label %exit
exit: ; preds = %codeRepl
call void @use(i32* %0)
call void @llvm.lifetime.end.p0i8(i64 4, i8* %.reload)
ret void
}
define internal void @foo.extract(i32* %0, i8** %.out) {
newFuncRoot:
br label %extract
exit.exitStub: ; preds = %extract
ret void
extract: ; preds = %newFuncRoot
%1 = bitcast i32* %0 to i8*
store i8* %1, i8** %.out, align 8
call void @use(i32* %0)
br label %exit.exitStub
}
```
**Extraction with patch**
```
define void @foo() {
entry:
%0 = alloca i32, align 4
br label %codeRepl
codeRepl: ; preds = %entry
%lt.cast1 = bitcast i32* %0 to i8*
call void @llvm.lifetime.start.p0i8(i64 -1, i8* %lt.cast1)
call void @foo.extract(i32* %0)
br label %exit
exit: ; preds = %codeRepl
call void @use(i32* %0)
%lt.cast = bitcast i32* %0 to i8*
call void @llvm.lifetime.end.p0i8(i64 4, i8* %lt.cast)
ret void
}
define internal void @foo.extract(i32* %0) {
newFuncRoot:
br label %extract
exit.exitStub: ; preds = %extract
ret void
extract: ; preds = %newFuncRoot
%1 = bitcast i32* %0 to i8*
call void @use(i32* %0)
br label %exit.exitStub
}
```
Reviewed By: vsk
Differential Revision: https://reviews.llvm.org/D90689
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
0 files changed, 0 insertions, 0 deletions