<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>