summaryrefslogtreecommitdiff
path: root/lib/Transforms/Scalar/GVN.cpp
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2012-03-29 17:22:39 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2012-03-29 17:22:39 +0000
commit41e2073f623a08504e2e1e5a9fc5c9f22a03eb83 (patch)
treec4f05adc3565dc1ccd4bdfd913e4a9b091e23fdb /lib/Transforms/Scalar/GVN.cpp
parent73478404af7f6b6e64bdda5920ebaede6a4e7a14 (diff)
downloadllvm-41e2073f623a08504e2e1e5a9fc5c9f22a03eb83.tar.gz
llvm-41e2073f623a08504e2e1e5a9fc5c9f22a03eb83.tar.bz2
llvm-41e2073f623a08504e2e1e5a9fc5c9f22a03eb83.tar.xz
Don't PRE compares.
CodeGenPrepare sinks compare instructions down to their uses to prevent live flags and predicate registers across basic blocks. PRE of a compare instruction prevents that, forcing the i1 compare result into a general purpose register. That is usually more expensive than the redundant compare PRE was trying to eliminate in the first place. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153657 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/GVN.cpp')
-rw-r--r--lib/Transforms/Scalar/GVN.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp
index 8b79d27b95..38afe1b83d 100644
--- a/lib/Transforms/Scalar/GVN.cpp
+++ b/lib/Transforms/Scalar/GVN.cpp
@@ -2328,7 +2328,14 @@ bool GVN::performPRE(Function &F) {
CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
isa<DbgInfoIntrinsic>(CurInst))
continue;
-
+
+ // Don't do PRE on compares. The PHI would prevent CodeGenPrepare from
+ // sinking the compare again, and it would force the code generator to
+ // move the i1 from processor flags or predicate registers into a general
+ // purpose register.
+ if (isa<CmpInst>(CurInst))
+ continue;
+
// We don't currently value number ANY inline asm calls.
if (CallInst *CallI = dyn_cast<CallInst>(CurInst))
if (CallI->isInlineAsm())