<div dir="ltr">FYi, some files slipped in here using the old header. I've fixed them, but something to keep an eye on with other patches.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Jan 31, 2019 at 1:10 AM Max Kazantsev via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: mkazantsev<br>
Date: Thu Jan 31 01:10:17 2019<br>
New Revision: 352739<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=352739&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=352739&view=rev</a><br>
Log:<br>
Default lowering for experimental.widenable.condition<br>
<br>
Introduces a pass that provides default lowering strategy for the<br>
`experimental.widenable.condition` intrinsic, replacing all its uses with<br>
`i1 true`.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D56096" rel="noreferrer" target="_blank">https://reviews.llvm.org/D56096</a><br>
Reviewed By: reames<br>
<br>
Added:<br>
llvm/trunk/include/llvm/Transforms/Scalar/LowerWidenableCondition.h<br>
llvm/trunk/lib/Transforms/Scalar/LowerWidenableCondition.cpp<br>
llvm/trunk/test/Transforms/LowerWidenableCondition/<br>
llvm/trunk/test/Transforms/LowerWidenableCondition/basic.ll<br>
Modified:<br>
llvm/trunk/include/llvm/InitializePasses.h<br>
llvm/trunk/include/llvm/Transforms/Scalar.h<br>
llvm/trunk/lib/Passes/PassBuilder.cpp<br>
llvm/trunk/lib/Passes/PassRegistry.def<br>
llvm/trunk/lib/Transforms/Scalar/CMakeLists.txt<br>
llvm/trunk/lib/Transforms/Scalar/Scalar.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/InitializePasses.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InitializePasses.h?rev=352739&r1=352738&r2=352739&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InitializePasses.h?rev=352739&r1=352738&r2=352739&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/InitializePasses.h (original)<br>
+++ llvm/trunk/include/llvm/InitializePasses.h Thu Jan 31 01:10:17 2019<br>
@@ -240,6 +240,7 @@ void initializeLowerAtomicLegacyPassPass<br>
void initializeLowerEmuTLSPass(PassRegistry&);<br>
void initializeLowerExpectIntrinsicPass(PassRegistry&);<br>
void initializeLowerGuardIntrinsicLegacyPassPass(PassRegistry&);<br>
+void initializeLowerWidenableConditionLegacyPassPass(PassRegistry&);<br>
void initializeLowerIntrinsicsPass(PassRegistry&);<br>
void initializeLowerInvokeLegacyPassPass(PassRegistry&);<br>
void initializeLowerSwitchPass(PassRegistry&);<br>
<br>
Modified: llvm/trunk/include/llvm/Transforms/Scalar.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar.h?rev=352739&r1=352738&r2=352739&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar.h?rev=352739&r1=352738&r2=352739&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Transforms/Scalar.h (original)<br>
+++ llvm/trunk/include/llvm/Transforms/Scalar.h Thu Jan 31 01:10:17 2019<br>
@@ -359,6 +359,12 @@ Pass *createLowerGuardIntrinsicPass();<br>
<br>
//===----------------------------------------------------------------------===//<br>
//<br>
+// LowerWidenableCondition - Lower widenable condition to i1 true.<br>
+//<br>
+Pass *createLowerWidenableConditionPass();<br>
+<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
// MergeICmps - Merge integer comparison chains into a memcmp<br>
//<br>
Pass *createMergeICmpsPass();<br>
<br>
Added: llvm/trunk/include/llvm/Transforms/Scalar/LowerWidenableCondition.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/LowerWidenableCondition.h?rev=352739&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/LowerWidenableCondition.h?rev=352739&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Transforms/Scalar/LowerWidenableCondition.h (added)<br>
+++ llvm/trunk/include/llvm/Transforms/Scalar/LowerWidenableCondition.h Thu Jan 31 01:10:17 2019<br>
@@ -0,0 +1,27 @@<br>
+//===--- LowerWidenableCondition.h - Lower the guard intrinsic ---------------===//<br>
+//<br>
+// The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// This pass lowers the llvm.widenable.condition intrinsic to default value<br>
+// which is i1 true.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+#ifndef LLVM_TRANSFORMS_SCALAR_LOWERWIDENABLECONDITION_H<br>
+#define LLVM_TRANSFORMS_SCALAR_LOWERWIDENABLECONDITION_H<br>
+<br>
+#include "llvm/IR/PassManager.h"<br>
+<br>
+namespace llvm {<br>
+<br>
+struct LowerWidenableConditionPass : PassInfoMixin<LowerWidenableConditionPass> {<br>
+ PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);<br>
+};<br>
+<br>
+}<br>
+<br>
+#endif //LLVM_TRANSFORMS_SCALAR_LOWERWIDENABLECONDITION_H<br>
<br>
Modified: llvm/trunk/lib/Passes/PassBuilder.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=352739&r1=352738&r2=352739&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=352739&r1=352738&r2=352739&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Passes/PassBuilder.cpp (original)<br>
+++ llvm/trunk/lib/Passes/PassBuilder.cpp Thu Jan 31 01:10:17 2019<br>
@@ -133,6 +133,7 @@<br>
#include "llvm/Transforms/Scalar/LowerAtomic.h"<br>
#include "llvm/Transforms/Scalar/LowerExpectIntrinsic.h"<br>
#include "llvm/Transforms/Scalar/LowerGuardIntrinsic.h"<br>
+#include "llvm/Transforms/Scalar/LowerWidenableCondition.h"<br>
#include "llvm/Transforms/Scalar/MakeGuardsExplicit.h"<br>
#include "llvm/Transforms/Scalar/MemCpyOptimizer.h"<br>
#include "llvm/Transforms/Scalar/MergedLoadStoreMotion.h"<br>
<br>
Modified: llvm/trunk/lib/Passes/PassRegistry.def<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassRegistry.def?rev=352739&r1=352738&r2=352739&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassRegistry.def?rev=352739&r1=352738&r2=352739&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Passes/PassRegistry.def (original)<br>
+++ llvm/trunk/lib/Passes/PassRegistry.def Thu Jan 31 01:10:17 2019<br>
@@ -177,6 +177,7 @@ FUNCTION_PASS("libcalls-shrinkwrap", Lib<br>
FUNCTION_PASS("loweratomic", LowerAtomicPass())<br>
FUNCTION_PASS("lower-expect", LowerExpectIntrinsicPass())<br>
FUNCTION_PASS("lower-guard-intrinsic", LowerGuardIntrinsicPass())<br>
+FUNCTION_PASS("lower-widenable-condition", LowerWidenableConditionPass())<br>
FUNCTION_PASS("guard-widening", GuardWideningPass())<br>
FUNCTION_PASS("gvn", GVN())<br>
FUNCTION_PASS("load-store-vectorizer", LoadStoreVectorizerPass())<br>
<br>
Modified: llvm/trunk/lib/Transforms/Scalar/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/CMakeLists.txt?rev=352739&r1=352738&r2=352739&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/CMakeLists.txt?rev=352739&r1=352738&r2=352739&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Scalar/CMakeLists.txt (original)<br>
+++ llvm/trunk/lib/Transforms/Scalar/CMakeLists.txt Thu Jan 31 01:10:17 2019<br>
@@ -45,6 +45,7 @@ add_llvm_library(LLVMScalarOpts<br>
LowerAtomic.cpp<br>
LowerExpectIntrinsic.cpp<br>
LowerGuardIntrinsic.cpp<br>
+ LowerWidenableCondition.cpp<br>
MakeGuardsExplicit.cpp<br>
MemCpyOptimizer.cpp<br>
MergeICmps.cpp<br>
<br>
Added: llvm/trunk/lib/Transforms/Scalar/LowerWidenableCondition.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LowerWidenableCondition.cpp?rev=352739&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LowerWidenableCondition.cpp?rev=352739&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Scalar/LowerWidenableCondition.cpp (added)<br>
+++ llvm/trunk/lib/Transforms/Scalar/LowerWidenableCondition.cpp Thu Jan 31 01:10:17 2019<br>
@@ -0,0 +1,86 @@<br>
+//===- LowerWidenableCondition.cpp - Lower the guard intrinsic ---------------===//<br>
+//<br>
+// The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// This pass lowers the llvm.widenable.condition intrinsic to default value<br>
+// which is i1 true.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "llvm/Transforms/Scalar/LowerWidenableCondition.h"<br>
+#include "llvm/ADT/SmallVector.h"<br>
+#include "llvm/Analysis/GuardUtils.h"<br>
+#include "llvm/IR/BasicBlock.h"<br>
+#include "llvm/IR/Function.h"<br>
+#include "llvm/IR/InstIterator.h"<br>
+#include "llvm/IR/Instructions.h"<br>
+#include "llvm/IR/Intrinsics.h"<br>
+#include "llvm/IR/Module.h"<br>
+#include "llvm/IR/PatternMatch.h"<br>
+#include "llvm/Pass.h"<br>
+#include "llvm/Transforms/Scalar.h"<br>
+#include "llvm/Transforms/Utils/GuardUtils.h"<br>
+<br>
+using namespace llvm;<br>
+<br>
+namespace {<br>
+struct LowerWidenableConditionLegacyPass : public FunctionPass {<br>
+ static char ID;<br>
+ LowerWidenableConditionLegacyPass() : FunctionPass(ID) {<br>
+ initializeLowerWidenableConditionLegacyPassPass(<br>
+ *PassRegistry::getPassRegistry());<br>
+ }<br>
+<br>
+ bool runOnFunction(Function &F) override;<br>
+};<br>
+}<br>
+<br>
+static bool lowerWidenableCondition(Function &F) {<br>
+ // Check if we can cheaply rule out the possibility of not having any work to<br>
+ // do.<br>
+ auto *WCDecl = F.getParent()->getFunction(<br>
+ Intrinsic::getName(Intrinsic::experimental_widenable_condition));<br>
+ if (!WCDecl || WCDecl->use_empty())<br>
+ return false;<br>
+<br>
+ using namespace llvm::PatternMatch;<br>
+ SmallVector<CallInst *, 8> ToLower;<br>
+ for (auto &I : instructions(F))<br>
+ if (match(&I, m_Intrinsic<Intrinsic::experimental_widenable_condition>()))<br>
+ ToLower.push_back(cast<CallInst>(&I));<br>
+<br>
+ if (ToLower.empty())<br>
+ return false;<br>
+<br>
+ for (auto *CI : ToLower) {<br>
+ CI->replaceAllUsesWith(ConstantInt::getTrue(CI->getContext()));<br>
+ CI->eraseFromParent();<br>
+ }<br>
+ return true;<br>
+}<br>
+<br>
+bool LowerWidenableConditionLegacyPass::runOnFunction(Function &F) {<br>
+ return lowerWidenableCondition(F);<br>
+}<br>
+<br>
+char LowerWidenableConditionLegacyPass::ID = 0;<br>
+INITIALIZE_PASS(LowerWidenableConditionLegacyPass, "lower-widenable-condition",<br>
+ "Lower the widenable condition to default true value", false,<br>
+ false)<br>
+<br>
+Pass *llvm::createLowerWidenableConditionPass() {<br>
+ return new LowerWidenableConditionLegacyPass();<br>
+}<br>
+<br>
+PreservedAnalyses LowerWidenableConditionPass::run(Function &F,<br>
+ FunctionAnalysisManager &AM) {<br>
+ if (lowerWidenableCondition(F))<br>
+ return PreservedAnalyses::none();<br>
+<br>
+ return PreservedAnalyses::all();<br>
+}<br>
<br>
Modified: llvm/trunk/lib/Transforms/Scalar/Scalar.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/Scalar.cpp?rev=352739&r1=352738&r2=352739&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/Scalar.cpp?rev=352739&r1=352738&r2=352739&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Scalar/Scalar.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Scalar/Scalar.cpp Thu Jan 31 01:10:17 2019<br>
@@ -80,6 +80,7 @@ void llvm::initializeScalarOpts(PassRegi<br>
initializeLowerAtomicLegacyPassPass(Registry);<br>
initializeLowerExpectIntrinsicPass(Registry);<br>
initializeLowerGuardIntrinsicLegacyPassPass(Registry);<br>
+ initializeLowerWidenableConditionLegacyPassPass(Registry);<br>
initializeMemCpyOptLegacyPassPass(Registry);<br>
initializeMergeICmpsPass(Registry);<br>
initializeMergedLoadStoreMotionLegacyPassPass(Registry);<br>
<br>
Added: llvm/trunk/test/Transforms/LowerWidenableCondition/basic.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LowerWidenableCondition/basic.ll?rev=352739&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LowerWidenableCondition/basic.ll?rev=352739&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Transforms/LowerWidenableCondition/basic.ll (added)<br>
+++ llvm/trunk/test/Transforms/LowerWidenableCondition/basic.ll Thu Jan 31 01:10:17 2019<br>
@@ -0,0 +1,44 @@<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py<br>
+; RUN: opt -S -lower-widenable-condition < %s | FileCheck %s<br>
+; RUN: opt -S -passes=lower-widenable-condition < %s | FileCheck %s<br>
+<br>
+; Basic test case: make sure that all widenable conditions turn into i1 true.<br>
+define void @f_0(i1 %cond_0, i1 %cond_1) {<br>
+; CHECK-LABEL: @f_0(<br>
+; CHECK-NEXT: entry:<br>
+; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[COND_0:%.*]], true<br>
+; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]]<br>
+; CHECK: deopt:<br>
+; CHECK-NEXT: unreachable<br>
+; CHECK: guarded:<br>
+; CHECK-NEXT: [[EXIPLICIT_GUARD_COND4:%.*]] = and i1 [[COND_1:%.*]], true<br>
+; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND4]], label [[GUARDED1:%.*]], label [[DEOPT2:%.*]]<br>
+; CHECK: deopt2:<br>
+; CHECK-NEXT: unreachable<br>
+; CHECK: guarded1:<br>
+; CHECK-NEXT: ret void<br>
+;<br>
+entry:<br>
+ %widenable_cond = call i1 @llvm.experimental.widenable.condition()<br>
+ %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond<br>
+ br i1 %exiplicit_guard_cond, label %guarded, label %deopt<br>
+<br>
+deopt: ; preds = %entry<br>
+ unreachable<br>
+<br>
+guarded: ; preds = %entry<br>
+ %widenable_cond3 = call i1 @llvm.experimental.widenable.condition()<br>
+ %exiplicit_guard_cond4 = and i1 %cond_1, %widenable_cond3<br>
+ br i1 %exiplicit_guard_cond4, label %guarded1, label %deopt2<br>
+<br>
+deopt2: ; preds = %guarded<br>
+ unreachable<br>
+<br>
+guarded1: ; preds = %guarded<br>
+ ret void<br>
+}<br>
+<br>
+; Function Attrs: inaccessiblememonly nounwind<br>
+declare i1 @llvm.experimental.widenable.condition() #0<br>
+<br>
+attributes #0 = { inaccessiblememonly nounwind }<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>