ssa: BinOp (map equal) fix

This commit is contained in:
xushiwei
2024-07-16 22:03:23 +08:00
parent cc6e4dbec0
commit 3ce55a2ac4

View File

@@ -501,6 +501,12 @@ func (b Builder) BinOp(op token.Token, x, y Expr) Expr {
case vkUnsigned, vkPtr: case vkUnsigned, vkPtr:
pred := uintPredOpToLLVM[op-predOpBase] pred := uintPredOpToLLVM[op-predOpBase]
return Expr{llvm.CreateICmp(b.impl, pred, x.impl, y.impl), tret} return Expr{llvm.CreateICmp(b.impl, pred, x.impl, y.impl), tret}
case vkMap:
switch op {
case token.EQL, token.NEQ:
pred := uintPredOpToLLVM[op-predOpBase]
return Expr{llvm.CreateICmp(b.impl, pred, x.impl, y.impl), tret}
}
case vkFloat: case vkFloat:
pred := floatPredOpToLLVM[op-predOpBase] pred := floatPredOpToLLVM[op-predOpBase]
return Expr{llvm.CreateFCmp(b.impl, pred, x.impl, y.impl), tret} return Expr{llvm.CreateFCmp(b.impl, pred, x.impl, y.impl), tret}
@@ -552,7 +558,7 @@ func (b Builder) BinOp(op token.Token, x, y Expr) Expr {
fallthrough fallthrough
case vkFuncPtr, vkFuncDecl: case vkFuncPtr, vkFuncDecl:
switch op { switch op {
case token.EQL: case token.EQL: // TODO(xsw): check this code
return b.Prog.BoolVal(x.impl.IsNull() == y.impl.IsNull()) return b.Prog.BoolVal(x.impl.IsNull() == y.impl.IsNull())
case token.NEQ: case token.NEQ:
return b.Prog.BoolVal(x.impl.IsNull() != y.impl.IsNull()) return b.Prog.BoolVal(x.impl.IsNull() != y.impl.IsNull())
@@ -605,13 +611,6 @@ func (b Builder) BinOp(op token.Token, x, y Expr) Expr {
case token.NEQ: case token.NEQ:
return Expr{b.impl.CreateICmp(llvm.IntNE, dx, dy, ""), tret} return Expr{b.impl.CreateICmp(llvm.IntNE, dx, dy, ""), tret}
} }
case vkMap:
switch op {
case token.EQL:
return b.Prog.BoolVal(x.impl.IsNull() == y.impl.IsNull())
case token.NEQ:
return b.Prog.BoolVal(x.impl.IsNull() != y.impl.IsNull())
}
case vkIface, vkEface: case vkIface, vkEface:
toEface := func(x Expr, emtpy bool) Expr { toEface := func(x Expr, emtpy bool) Expr {
if emtpy { if emtpy {