mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-10-10 00:18:59 +00:00
Implement == and != correctly. Before they would incorrectly return !=
for some constant exprs when they could really be the same value git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10058 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -47,19 +47,6 @@ namespace llvm {
|
||||
|
||||
class PointerType;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Implement == and != directly...
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
inline ConstantBool *operator==(const Constant &V1, const Constant &V2) {
|
||||
assert(V1.getType() == V2.getType() && "Constant types must be identical!");
|
||||
return ConstantBool::get(&V1 == &V2);
|
||||
}
|
||||
|
||||
inline ConstantBool *operator!=(const Constant &V1, const Constant &V2) {
|
||||
return ConstantBool::get(&V1 != &V2);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Implement all other operators indirectly through TypeRules system
|
||||
//===----------------------------------------------------------------------===//
|
||||
@@ -81,6 +68,8 @@ struct ConstRules {
|
||||
|
||||
virtual ConstantBool *lessthan(const Constant *V1,
|
||||
const Constant *V2) const = 0;
|
||||
virtual ConstantBool *equalto(const Constant *V1,
|
||||
const Constant *V2) const = 0;
|
||||
|
||||
// Casting operators. ick
|
||||
virtual ConstantBool *castToBool (const Constant *V) const = 0;
|
||||
@@ -195,11 +184,21 @@ inline ConstantBool *operator<(const Constant &V1,
|
||||
return ConstRules::get(V1, V2).lessthan(&V1, &V2);
|
||||
}
|
||||
|
||||
inline ConstantBool *operator==(const Constant &V1, const Constant &V2) {
|
||||
assert(V1.getType() == V2.getType() && "Constant types must be identical!");
|
||||
return ConstRules::get(V1, V2).equalto(&V1, &V2);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Implement 'derived' operators based on what we already have...
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
inline ConstantBool *operator!=(const Constant &V1, const Constant &V2) {
|
||||
if (ConstantBool *V = (V1 == V2))
|
||||
return V->inverted(); // !(V1 == V2)
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline ConstantBool *operator>(const Constant &V1,
|
||||
const Constant &V2) {
|
||||
return V2 < V1;
|
||||
|
Reference in New Issue
Block a user