diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2014-12-09 01:02:12 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2014-12-09 01:02:12 +0000 |
commit | c5b84a53f7f0c2a8eb86fed138f6d4da78816cfb (patch) | |
tree | a6282d6d02366c7e998db9b23b69aaa251192cf1 /llgo/irgen | |
parent | c8cf2b88bca148c2aa936150aec1689790fbd237 (diff) | |
download | bcm5719-llvm-c5b84a53f7f0c2a8eb86fed138f6d4da78816cfb.tar.gz bcm5719-llvm-c5b84a53f7f0c2a8eb86fed138f6d4da78816cfb.zip |
Optimize comparisons to empty string.
Geo-mean performance improvement of 0.2% (-0.3% - 0.9% @ 95% CI).
Differential Revision: http://reviews.llvm.org/D6569
llvm-svn: 223728
Diffstat (limited to 'llgo/irgen')
-rw-r--r-- | llgo/irgen/strings.go | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/llgo/irgen/strings.go b/llgo/irgen/strings.go index 4a6554b11d5..f7ed46ba6b2 100644 --- a/llgo/irgen/strings.go +++ b/llgo/irgen/strings.go @@ -24,7 +24,23 @@ func (fr *frame) concatenateStrings(lhs, rhs *govalue) *govalue { return newValue(result[0], types.Typ[types.String]) } +func (fr *frame) compareStringEmpty(v llvm.Value) *govalue { + len := fr.builder.CreateExtractValue(v, 1, "") + result := fr.builder.CreateIsNull(len, "") + result = fr.builder.CreateZExt(result, llvm.Int8Type(), "") + return newValue(result, types.Typ[types.Bool]) +} + func (fr *frame) compareStrings(lhs, rhs *govalue, op token.Token) *govalue { + if op == token.EQL { + if lhs.value.IsNull() { + return fr.compareStringEmpty(rhs.value) + } + if rhs.value.IsNull() { + return fr.compareStringEmpty(lhs.value) + } + } + result := fr.runtime.strcmp.call(fr, lhs.value, rhs.value)[0] zero := llvm.ConstNull(fr.types.inttype) var pred llvm.IntPredicate |