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
GitOrigin-RevId: c5b84a53f7f0c2a8eb86fed138f6d4da78816cfb
diff --git a/irgen/strings.go b/irgen/strings.go
index 4a6554b..f7ed46b 100644
--- a/irgen/strings.go
+++ b/irgen/strings.go
@@ -24,7 +24,23 @@
 	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