Introduce llvm::CmpPredicate, an abstraction over a floating-point predicate, and a pack of an integer predicate with samesign information, in order to ease extending large portions of the codebase that take a CmpInst::Predicate to respect the samesign flag. We have chosen to demonstrate the utility of this new abstraction by migrating parts of ValueTracking, InstructionSimplify, and InstCombine from CmpInst::Predicate to llvm::CmpPredicate. There should be no functional changes, as we don't perform any extra optimizations with samesign in this patch, or use CmpPredicate::getMatching. The design approach taken by this patch allows for unaudited callers of APIs that take a llvm::CmpPredicate to silently drop the samesign information; it does not pose a correctness issue, and allows us to migrate the codebase piece-wise.
63 lines
2.3 KiB
C++
63 lines
2.3 KiB
C++
//===- CmpPredicate.h - CmpInst Predicate with samesign information -------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// A CmpInst::Predicate with any samesign information (applicable to ICmpInst).
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_IR_CMPPREDICATE_H
|
|
#define LLVM_IR_CMPPREDICATE_H
|
|
|
|
#include "llvm/IR/InstrTypes.h"
|
|
|
|
namespace llvm {
|
|
/// An abstraction over a floating-point predicate, and a pack of an integer
|
|
/// predicate with samesign information. Some functions in ICmpInst construct
|
|
/// and return this type in place of a Predicate.
|
|
class CmpPredicate {
|
|
CmpInst::Predicate Pred;
|
|
bool HasSameSign;
|
|
|
|
public:
|
|
/// Constructed implictly with a either Predicate and samesign information, or
|
|
/// just a Predicate, dropping samesign information.
|
|
CmpPredicate(CmpInst::Predicate Pred, bool HasSameSign = false)
|
|
: Pred(Pred), HasSameSign(HasSameSign) {
|
|
assert(!HasSameSign || CmpInst::isIntPredicate(Pred));
|
|
}
|
|
|
|
/// Implictly converts to the underlying Predicate, dropping samesign
|
|
/// information.
|
|
operator CmpInst::Predicate() const { return Pred; }
|
|
|
|
/// Query samesign information, for optimizations.
|
|
bool hasSameSign() const { return HasSameSign; }
|
|
|
|
/// Compares two CmpPredicates taking samesign into account and returns the
|
|
/// canonicalized CmpPredicate if they match. An alternative to operator==.
|
|
///
|
|
/// For example,
|
|
/// samesign ult + samesign ult -> samesign ult
|
|
/// samesign ult + ult -> ult
|
|
/// samesign ult + slt -> slt
|
|
/// ult + ult -> ult
|
|
/// ult + slt -> std::nullopt
|
|
static std::optional<CmpPredicate> getMatching(CmpPredicate A,
|
|
CmpPredicate B);
|
|
|
|
/// An operator== on the underlying Predicate.
|
|
bool operator==(CmpInst::Predicate P) const { return Pred == P; }
|
|
|
|
/// There is no operator== defined on CmpPredicate. Use getMatching instead to
|
|
/// get the canonicalized matching CmpPredicate.
|
|
bool operator==(CmpPredicate) const = delete;
|
|
};
|
|
} // namespace llvm
|
|
|
|
#endif
|