Merge pull request #539 from visualfc/bineq
ssa: fix binop closure/funcdecl
This commit is contained in:
@@ -10,10 +10,15 @@ func init() {
|
|||||||
fn3 := func() { println(n) }
|
fn3 := func() { println(n) }
|
||||||
var fn4 func() int
|
var fn4 func() int
|
||||||
assert(test != nil)
|
assert(test != nil)
|
||||||
|
assert(nil != test)
|
||||||
assert(fn1 != nil)
|
assert(fn1 != nil)
|
||||||
|
assert(nil != fn1)
|
||||||
assert(fn2 != nil)
|
assert(fn2 != nil)
|
||||||
|
assert(nil != fn2)
|
||||||
assert(fn3 != nil)
|
assert(fn3 != nil)
|
||||||
|
assert(nil != fn3)
|
||||||
assert(fn4 == nil)
|
assert(fn4 == nil)
|
||||||
|
assert(nil == fn4)
|
||||||
}
|
}
|
||||||
|
|
||||||
// array
|
// array
|
||||||
|
|||||||
@@ -96,7 +96,15 @@ _llgo_0:
|
|||||||
call void @main.assert(i1 true)
|
call void @main.assert(i1 true)
|
||||||
call void @main.assert(i1 true)
|
call void @main.assert(i1 true)
|
||||||
call void @main.assert(i1 true)
|
call void @main.assert(i1 true)
|
||||||
|
call void @main.assert(i1 true)
|
||||||
|
call void @main.assert(i1 true)
|
||||||
|
call void @main.assert(i1 true)
|
||||||
%7 = extractvalue { ptr, ptr } %6, 0
|
%7 = extractvalue { ptr, ptr } %6, 0
|
||||||
|
%8 = icmp ne ptr %7, null
|
||||||
|
call void @main.assert(i1 %8)
|
||||||
|
%9 = extractvalue { ptr, ptr } %6, 0
|
||||||
|
%10 = icmp ne ptr null, %9
|
||||||
|
call void @main.assert(i1 %10)
|
||||||
call void @main.assert(i1 true)
|
call void @main.assert(i1 true)
|
||||||
call void @main.assert(i1 true)
|
call void @main.assert(i1 true)
|
||||||
ret void
|
ret void
|
||||||
|
|||||||
29
ssa/expr.go
29
ssa/expr.go
@@ -501,12 +501,6 @@ 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}
|
||||||
@@ -554,21 +548,18 @@ func (b Builder) BinOp(op token.Token, x, y Expr) Expr {
|
|||||||
}
|
}
|
||||||
case vkClosure:
|
case vkClosure:
|
||||||
x = b.Field(x, 0)
|
x = b.Field(x, 0)
|
||||||
y = b.Field(y, 0)
|
if y.kind == vkClosure {
|
||||||
fallthrough
|
y = b.Field(y, 0)
|
||||||
case vkFuncPtr, vkFuncDecl:
|
}
|
||||||
switch op {
|
fallthrough
|
||||||
case token.EQL: // TODO(xsw): check this code
|
case vkFuncPtr, vkFuncDecl, vkChan, vkMap:
|
||||||
return b.Prog.BoolVal(x.impl.IsNull() == y.impl.IsNull())
|
if y.kind == vkClosure {
|
||||||
case token.NEQ:
|
y = b.Field(y, 0)
|
||||||
return b.Prog.BoolVal(x.impl.IsNull() != y.impl.IsNull())
|
|
||||||
}
|
}
|
||||||
case vkChan:
|
|
||||||
switch op {
|
switch op {
|
||||||
case token.EQL:
|
case token.EQL, token.NEQ:
|
||||||
return Expr{llvm.CreateICmp(b.impl, llvm.IntEQ, x.impl, y.impl), tret}
|
pred := uintPredOpToLLVM[op-predOpBase]
|
||||||
case token.NEQ:
|
return Expr{llvm.CreateICmp(b.impl, pred, x.impl, y.impl), tret}
|
||||||
return Expr{llvm.CreateICmp(b.impl, llvm.IntNE, x.impl, y.impl), tret}
|
|
||||||
}
|
}
|
||||||
case vkArray:
|
case vkArray:
|
||||||
typ := x.raw.Type.(*types.Array)
|
typ := x.raw.Type.(*types.Array)
|
||||||
|
|||||||
Reference in New Issue
Block a user