[llvm] r284028 - [SimplifyCFG] Don't create PHI nodes for constant bundle operands
Sanjoy Das via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 12 11:15:34 PDT 2016
Author: sanjoy
Date: Wed Oct 12 13:15:33 2016
New Revision: 284028
URL: http://llvm.org/viewvc/llvm-project?rev=284028&view=rev
Log:
[SimplifyCFG] Don't create PHI nodes for constant bundle operands
Summary:
Constant bundle operands may need to retain their constant-ness for
correctness. I'll admit that this is slightly odd, but it looks like
SimplifyCFG already does this for things like @llvm.frameaddress and
@llvm.stackmap, so I suppose adding one more case is not a big deal.
It is possible to add a mechanism to denote bundle operands that need to
remain constants, but that's probably too complicated for the time
being.
Reviewers: jmolloy
Subscribers: mcrosier, llvm-commits
Differential Revision: https://reviews.llvm.org/D25502
Modified:
llvm/trunk/include/llvm/IR/CallSite.h
llvm/trunk/include/llvm/IR/InstrTypes.h
llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
llvm/trunk/test/Transforms/SimplifyCFG/sink-common-code.ll
Modified: llvm/trunk/include/llvm/IR/CallSite.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/CallSite.h?rev=284028&r1=284027&r2=284028&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/CallSite.h (original)
+++ llvm/trunk/include/llvm/IR/CallSite.h Wed Oct 12 13:15:33 2016
@@ -512,6 +512,10 @@ public:
CALLSITE_DELEGATE_GETTER(countOperandBundlesOfType(ID));
}
+ bool isBundleOperand(unsigned Idx) const {
+ CALLSITE_DELEGATE_GETTER(isBundleOperand(Idx));
+ }
+
IterTy arg_begin() const {
CALLSITE_DELEGATE_GETTER(arg_begin());
}
Modified: llvm/trunk/include/llvm/IR/InstrTypes.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/InstrTypes.h?rev=284028&r1=284027&r2=284028&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/InstrTypes.h (original)
+++ llvm/trunk/include/llvm/IR/InstrTypes.h Wed Oct 12 13:15:33 2016
@@ -1337,6 +1337,12 @@ public:
return bundle_op_info_end()[-1].End;
}
+ /// Return true if the operand at index \p Idx is a bundle operand.
+ bool isBundleOperand(unsigned Idx) const {
+ return hasOperandBundles() && Idx >= getBundleOperandsStartIndex() &&
+ Idx < getBundleOperandsEndIndex();
+ }
+
/// \brief Return the total number operands (not operand bundles) used by
/// every operand bundle in this OperandBundleUser.
unsigned getNumTotalBundleOperands() const {
Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=284028&r1=284027&r2=284028&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Wed Oct 12 13:15:33 2016
@@ -1362,7 +1362,16 @@ static bool canReplaceOperandWithVariabl
// FIXME: many arithmetic intrinsics have no issue taking a
// variable, however it's hard to distingish these from
// specials such as @llvm.frameaddress that require a constant.
- return !isa<IntrinsicInst>(I);
+ if (isa<IntrinsicInst>(I))
+ return false;
+
+ // Constant bundle operands may need to retain their constant-ness for
+ // correctness.
+ if (ImmutableCallSite(I).isBundleOperand(OpIdx))
+ return false;
+
+ return true;
+
case Instruction::ShuffleVector:
// Shufflevector masks are constant.
return OpIdx != 2;
Modified: llvm/trunk/test/Transforms/SimplifyCFG/sink-common-code.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyCFG/sink-common-code.ll?rev=284028&r1=284027&r2=284028&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/SimplifyCFG/sink-common-code.ll (original)
+++ llvm/trunk/test/Transforms/SimplifyCFG/sink-common-code.ll Wed Oct 12 13:15:33 2016
@@ -755,6 +755,32 @@ if.end:
; CHECK-NOT: exact
; CHECK: }
+declare i32 @call_target()
+
+define void @test_operand_bundles(i1 %cond, i32* %ptr) {
+entry:
+ br i1 %cond, label %left, label %right
+
+left:
+ %val0 = call i32 @call_target() [ "deopt"(i32 10) ]
+ store i32 %val0, i32* %ptr
+ br label %merge
+
+right:
+ %val1 = call i32 @call_target() [ "deopt"(i32 20) ]
+ store i32 %val1, i32* %ptr
+ br label %merge
+
+merge:
+ ret void
+}
+
+; CHECK-LABEL: @test_operand_bundles(
+; CHECK: left:
+; CHECK-NEXT: %val0 = call i32 @call_target() [ "deopt"(i32 10) ]
+; CHECK: right:
+; CHECK-NEXT: %val1 = call i32 @call_target() [ "deopt"(i32 20) ]
+
; CHECK: !0 = !{!1, !1, i64 0}
; CHECK: !1 = !{!"float", !2}
; CHECK: !2 = !{!"an example type tree"}
More information about the llvm-commits
mailing list