forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
IR: introduce struct with CmpInst::Predicate and samesign (llvm#116867)
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.
- Loading branch information
Showing
13 changed files
with
228 additions
and
111 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
//===- 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.