[PATCH] D53098: [InstCombine] Avoid instruction sinking if not profitable for other passes
Dávid Bolvanský via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 10 13:16:43 PDT 2018
xbolva00 updated this revision to Diff 169078.
xbolva00 added a comment.
- Fixed formatting
https://reviews.llvm.org/D53098
Files:
lib/Transforms/InstCombine/InstructionCombining.cpp
test/Transforms/InstCombine/no-sink-nonnull-args.ll
Index: test/Transforms/InstCombine/no-sink-nonnull-args.ll
===================================================================
--- test/Transforms/InstCombine/no-sink-nonnull-args.ll
+++ test/Transforms/InstCombine/no-sink-nonnull-args.ll
@@ -0,0 +1,56 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -instcombine -S | FileCheck %s
+
+define i32 @no_sink_nonnull(i8* nonnull readonly %s) {
+; CHECK-LABEL: @no_sink_nonnull(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[CALL:%.*]] = tail call i32 @foo(i8* nonnull [[S:%.*]])
+; CHECK-NEXT: br i1 false, label [[IF_THEN:%.*]], label [[IF_END:%.*]]
+; CHECK: if.then:
+; CHECK-NEXT: unreachable
+; CHECK: if.end:
+; CHECK-NEXT: ret i32 [[CALL]]
+;
+entry:
+ %call = tail call i32 @foo(i8* nonnull %s)
+ %tobool = icmp eq i8* %s, null
+ br i1 %tobool, label %if.then, label %if.end
+
+if.then:
+ tail call void @abort()
+ unreachable
+
+if.end:
+ ret i32 %call
+}
+
+define i32 @sink(i8* readonly %s) {
+; CHECK-LABEL: @sink(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i8* [[S:%.*]], null
+; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
+; CHECK: if.then:
+; CHECK-NEXT: tail call void @abort()
+; CHECK-NEXT: unreachable
+; CHECK: if.end:
+; CHECK-NEXT: [[CALL:%.*]] = tail call i32 @foo(i8* nonnull [[S]])
+; CHECK-NEXT: ret i32 [[CALL]]
+;
+entry:
+ %call = tail call i32 @foo(i8* %s)
+ %tobool = icmp eq i8* %s, null
+ br i1 %tobool, label %if.then, label %if.end
+
+if.then:
+ tail call void @abort()
+ unreachable
+
+if.end:
+ ret i32 %call
+}
+
+; Function Attrs: argmemonly nounwind readonly
+declare i32 @foo(i8* nocapture) local_unnamed_addr #1
+declare void @abort()
+
+attributes #1 = { argmemonly nounwind readonly "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
Index: lib/Transforms/InstCombine/InstructionCombining.cpp
===================================================================
--- lib/Transforms/InstCombine/InstructionCombining.cpp
+++ lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -2981,6 +2981,18 @@
return nullptr;
}
+static bool isProfitableToSink(CallInst &CI) {
+ // If the function is called some nonnull argument, we should not sink it.
+ // Later passes can be more powerful (e.g. optimize null checks)
+ for (auto &Arg : CI.getCalledFunction()->args()) {
+ auto *FArg = dyn_cast<Argument>(CI.getArgOperand(Arg.getArgNo()));
+ if (FArg && FArg->hasNonNullAttr()) {
+ return false;
+ }
+ }
+ return true;
+}
+
/// Try to move the specified instruction from its current block into the
/// beginning of DestBlock, which can only happen if it's safe to move the
/// instruction past all of the instructions between it and the end of its
@@ -3005,7 +3017,7 @@
// Do not sink convergent call instructions.
if (auto *CI = dyn_cast<CallInst>(I)) {
- if (CI->isConvergent())
+ if (CI->isConvergent() || !isProfitableToSink(*CI))
return false;
}
// We can only sink load instructions if there is nothing between the load and
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D53098.169078.patch
Type: text/x-patch
Size: 3478 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181010/77cbdcdb/attachment.bin>
More information about the llvm-commits
mailing list