summaryrefslogtreecommitdiffstats
path: root/llgo/irgen
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2014-12-09 01:02:12 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2014-12-09 01:02:12 +0000
commitc5b84a53f7f0c2a8eb86fed138f6d4da78816cfb (patch)
treea6282d6d02366c7e998db9b23b69aaa251192cf1 /llgo/irgen
parentc8cf2b88bca148c2aa936150aec1689790fbd237 (diff)
downloadbcm5719-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.go16
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
OpenPOWER on IntegriCloud