2018-08-30 05:39:16 +02:00
|
|
|
//===-- GuardUtils.h - Utils for work with guards ---------------*- C++ -*-===//
|
|
|
|
//
|
2019-01-19 09:50:56 +01:00
|
|
|
// 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
|
2018-08-30 05:39:16 +02:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// Utils that are used to perform analyzes related to guards and their
|
|
|
|
// conditions.
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef LLVM_ANALYSIS_GUARDUTILS_H
|
|
|
|
#define LLVM_ANALYSIS_GUARDUTILS_H
|
|
|
|
|
|
|
|
namespace llvm {
|
|
|
|
|
2019-01-22 12:21:32 +01:00
|
|
|
class BasicBlock;
|
2019-11-22 00:06:01 +01:00
|
|
|
class Use;
|
2018-08-30 05:39:16 +02:00
|
|
|
class User;
|
2019-01-22 12:21:32 +01:00
|
|
|
class Value;
|
2018-08-30 05:39:16 +02:00
|
|
|
|
2019-01-22 10:36:22 +01:00
|
|
|
/// Returns true iff \p U has semantics of a guard expressed in a form of call
|
|
|
|
/// of llvm.experimental.guard intrinsic.
|
2018-08-30 05:39:16 +02:00
|
|
|
bool isGuard(const User *U);
|
|
|
|
|
[NFC] Factor out utilities for manipulating widenable branches
With the widenable condition construct, we have the ability to reason about branches which can be 'widened' (i.e. made to fail more often). We've got a couple o transforms which leverage this. This patch just cleans up the API a bit.
This is prep work for generalizing our definition of a widenable branch slightly. At the moment "br i1 (and A, wc()), ..." is considered widenable, but oddly, neither "br i1 (and wc(), B), ..." or "br i1 wc(), ..." is. That clearly needs addressed, so first, let's centralize the code in one place.
2019-11-19 23:43:13 +01:00
|
|
|
/// Returns true iff \p U is a widenable branch (that is, parseWidenableBranch
|
|
|
|
/// returns true).
|
|
|
|
bool isWidenableBranch(const User *U);
|
|
|
|
|
2019-01-22 10:36:22 +01:00
|
|
|
/// Returns true iff \p U has semantics of a guard expressed in a form of a
|
|
|
|
/// widenable conditional branch to deopt block.
|
|
|
|
bool isGuardAsWidenableBranch(const User *U);
|
|
|
|
|
2019-01-22 12:21:32 +01:00
|
|
|
/// If U is widenable branch looking like:
|
|
|
|
/// %cond = ...
|
|
|
|
/// %wc = call i1 @llvm.experimental.widenable.condition()
|
|
|
|
/// %branch_cond = and i1 %cond, %wc
|
|
|
|
/// br i1 %branch_cond, label %if_true_bb, label %if_false_bb ; <--- U
|
|
|
|
/// The function returns true, and the values %cond and %wc and blocks
|
|
|
|
/// %if_true_bb, if_false_bb are returned in
|
|
|
|
/// the parameters (Condition, WidenableCondition, IfTrueBB and IfFalseFF)
|
|
|
|
/// respectively. If \p U does not match this pattern, return false.
|
|
|
|
bool parseWidenableBranch(const User *U, Value *&Condition,
|
|
|
|
Value *&WidenableCondition, BasicBlock *&IfTrueBB,
|
|
|
|
BasicBlock *&IfFalseBB);
|
|
|
|
|
2019-11-22 00:06:01 +01:00
|
|
|
/// Analgous to the above, but return the Uses so that that they can be
|
|
|
|
/// modified. Unlike previous version, Condition is optional and may be null.
|
|
|
|
bool parseWidenableBranch(User *U, Use *&Cond, Use *&WC, BasicBlock *&IfTrueBB,
|
|
|
|
BasicBlock *&IfFalseBB);
|
|
|
|
|
2018-08-30 05:39:16 +02:00
|
|
|
} // llvm
|
|
|
|
|
|
|
|
#endif // LLVM_ANALYSIS_GUARDUTILS_H
|