[llvm] r322125 - [IPSCCP] Remove calls without side effects

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 9 16:01:58 PST 2018


This appears to be duplicating functionality from 
isInstructionTriviallyDead.  Please merge them.

Philip


On 01/09/2018 01:58 PM, Chris Bieneman via llvm-commits wrote:
> Author: cbieneman
> Date: Tue Jan  9 13:58:46 2018
> New Revision: 322125
>
> URL: http://llvm.org/viewvc/llvm-project?rev=322125&view=rev
> Log:
> [IPSCCP] Remove calls without side effects
>
> Summary:
> When performing constant propagation for call instructions we have historically replaced all uses of the return from a call, but not removed the call itself. This is required for correctness if the calls have side effects, however the compiler should be able to safely remove calls that don't have side effects.
>
> This allows the compiler to completely fold away calls to functions that have no side effects if the inputs are constant and the output can be determined at compile time.
>
> Reviewers: davide, sanjoy, bruno, dberlin
>
> Subscribers: llvm-commits
>
> Differential Revision: https://reviews.llvm.org/D38856
>
> Added:
>      llvm/trunk/test/Transforms/IPConstantProp/remove-call-inst.ll
>        - copied, changed from r322124, llvm/trunk/test/Transforms/IPConstantProp/user-with-multiple-uses.ll
> Modified:
>      llvm/trunk/include/llvm/IR/Instruction.h
>      llvm/trunk/lib/IR/Instruction.cpp
>      llvm/trunk/lib/Transforms/Scalar/SCCP.cpp
>      llvm/trunk/test/Transforms/IPConstantProp/user-with-multiple-uses.ll
>
> Modified: llvm/trunk/include/llvm/IR/Instruction.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Instruction.h?rev=322125&r1=322124&r2=322125&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/Instruction.h (original)
> +++ llvm/trunk/include/llvm/IR/Instruction.h Tue Jan  9 13:58:46 2018
> @@ -535,6 +535,14 @@ public:
>     /// matters, isSafeToSpeculativelyExecute may be more appropriate.
>     bool mayHaveSideEffects() const { return mayWriteToMemory() || mayThrow(); }
>   
> +  /// Return true if the instruction can be removed if the result is unused.
> +  ///
> +  /// When constant folding some instructions cannot be removed even if their
> +  /// results are unused. Specifically terminator instructions and calls that
> +  /// may have side effects cannot be removed without semantically changing the
> +  /// generated program.
> +  bool isSafeToRemove() const;
> +
>     /// Return true if the instruction is a variety of EH-block.
>     bool isEHPad() const {
>       switch (getOpcode()) {
>
> Modified: llvm/trunk/lib/IR/Instruction.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Instruction.cpp?rev=322125&r1=322124&r2=322125&view=diff
> ==============================================================================
> --- llvm/trunk/lib/IR/Instruction.cpp (original)
> +++ llvm/trunk/lib/IR/Instruction.cpp Tue Jan  9 13:58:46 2018
> @@ -589,6 +589,11 @@ bool Instruction::mayThrow() const {
>     return isa<ResumeInst>(this);
>   }
>   
> +bool Instruction::isSafeToRemove() const {
> +  return (!isa<CallInst>(this) || !this->mayHaveSideEffects()) &&
> +         !isa<TerminatorInst>(this);
> +}
> +
>   bool Instruction::isAssociative() const {
>     unsigned Opcode = getOpcode();
>     if (isAssociative(Opcode))
>
> Modified: llvm/trunk/lib/Transforms/Scalar/SCCP.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SCCP.cpp?rev=322125&r1=322124&r2=322125&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/SCCP.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/SCCP.cpp Tue Jan  9 13:58:46 2018
> @@ -1900,7 +1900,7 @@ static bool runIPSCCP(Module &M, const D
>           if (Inst->getType()->isVoidTy())
>             continue;
>           if (tryToReplaceWithConstant(Solver, Inst)) {
> -          if (!isa<CallInst>(Inst) && !isa<TerminatorInst>(Inst))
> +          if (Inst->isSafeToRemove())
>               Inst->eraseFromParent();
>             // Hey, we just changed something!
>             MadeChanges = true;
>
> Copied: llvm/trunk/test/Transforms/IPConstantProp/remove-call-inst.ll (from r322124, llvm/trunk/test/Transforms/IPConstantProp/user-with-multiple-uses.ll)
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IPConstantProp/remove-call-inst.ll?p2=llvm/trunk/test/Transforms/IPConstantProp/remove-call-inst.ll&p1=llvm/trunk/test/Transforms/IPConstantProp/user-with-multiple-uses.ll&r1=322124&r2=322125&rev=322125&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/IPConstantProp/user-with-multiple-uses.ll (original)
> +++ llvm/trunk/test/Transforms/IPConstantProp/remove-call-inst.ll Tue Jan  9 13:58:46 2018
> @@ -6,7 +6,7 @@
>   
>   ; CHECK: define i32 @main() #0 {
>   ; CHECK-NEXT: entry:
> -; CHECK-NEXT: %call2 = tail call i32 @wwrite(i64 0) [[NUW:#[0-9]+]]
> +; CHECK-NOT: call
>   ; CHECK-NEXT: ret i32 123
>   
>   define i32 @main() noreturn nounwind {
> @@ -31,4 +31,3 @@ return:
>   
>   ; CHECK: attributes #0 = { noreturn nounwind }
>   ; CHECK: attributes #1 = { nounwind readnone }
> -; CHECK: attributes [[NUW]] = { nounwind }
>
> Modified: llvm/trunk/test/Transforms/IPConstantProp/user-with-multiple-uses.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IPConstantProp/user-with-multiple-uses.ll?rev=322125&r1=322124&r2=322125&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/IPConstantProp/user-with-multiple-uses.ll (original)
> +++ llvm/trunk/test/Transforms/IPConstantProp/user-with-multiple-uses.ll Tue Jan  9 13:58:46 2018
> @@ -15,7 +15,7 @@ entry:
>     ret i32 %call2
>   }
>   
> -define internal i32 @wwrite(i64 %i) nounwind readnone {
> +define internal i32 @wwrite(i64 %i) nounwind {
>   entry:
>     switch i64 %i, label %sw.default [
>       i64 3, label %return
> @@ -30,5 +30,4 @@ return:
>   }
>   
>   ; CHECK: attributes #0 = { noreturn nounwind }
> -; CHECK: attributes #1 = { nounwind readnone }
> -; CHECK: attributes [[NUW]] = { nounwind }
> +; CHECK: attributes #1 = { nounwind }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list