Skip to content

Commit 539cc5c

Browse files
eliasnauraykevl
authored andcommitted
transform: optimize range over []byte(string)
Fixes #2700
1 parent 45cc5b5 commit 539cc5c

File tree

3 files changed

+19
-3
lines changed

3 files changed

+19
-3
lines changed

transform/testdata/stringtobytes.ll

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ target triple = "x86_64--linux"
55

66
declare { ptr, i64, i64 } @runtime.stringToBytes(ptr, i64)
77

8+
declare void @printByte(i8)
9+
810
declare void @printSlice(ptr nocapture readonly, i64, i64)
911

1012
declare void @writeToSlice(ptr nocapture, i64, i64)
@@ -17,6 +19,12 @@ entry:
1719
%2 = extractvalue { ptr, i64, i64 } %0, 1
1820
%3 = extractvalue { ptr, i64, i64 } %0, 2
1921
call fastcc void @printSlice(ptr %1, i64 %2, i64 %3)
22+
23+
; print(slice[0])
24+
%indexaddr.ptr1 = extractvalue { ptr, i64, i64 } %0, 0
25+
%4 = getelementptr inbounds i8, ptr %indexaddr.ptr1, i64 0
26+
%5 = load i8, ptr %4, align 1
27+
call fastcc void @printByte(i8 %5)
2028
ret void
2129
}
2230

transform/testdata/stringtobytes.out.ll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,18 @@ target triple = "x86_64--linux"
55

66
declare { ptr, i64, i64 } @runtime.stringToBytes(ptr, i64)
77

8+
declare void @printByte(i8)
9+
810
declare void @printSlice(ptr nocapture readonly, i64, i64)
911

1012
declare void @writeToSlice(ptr nocapture, i64, i64)
1113

1214
define void @testReadOnly() {
1315
entry:
1416
call fastcc void @printSlice(ptr @str, i64 6, i64 6)
17+
%0 = getelementptr inbounds i8, ptr @str, i64 0
18+
%1 = load i8, ptr %0, align 1
19+
call fastcc void @printByte(i8 %1)
1520
ret void
1621
}
1722

transform/util.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,18 @@ func hasFlag(call, param llvm.Value, kind string) bool {
3838
func isReadOnly(value llvm.Value) bool {
3939
uses := getUses(value)
4040
for _, use := range uses {
41-
if !use.IsAGetElementPtrInst().IsNil() {
41+
switch {
42+
case !use.IsAGetElementPtrInst().IsNil():
4243
if !isReadOnly(use) {
4344
return false
4445
}
45-
} else if !use.IsACallInst().IsNil() {
46+
case !use.IsACallInst().IsNil():
4647
if !hasFlag(use, value, "readonly") {
4748
return false
4849
}
49-
} else {
50+
case !use.IsALoadInst().IsNil():
51+
// Loads are read-only.
52+
default:
5053
// Unknown instruction, might not be readonly.
5154
return false
5255
}

0 commit comments

Comments
 (0)