aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPreston Gurd <preston.gurd@intel.com>2012-10-03 16:11:44 +0000
committerPreston Gurd <preston.gurd@intel.com>2012-10-03 16:11:44 +0000
commitfcf0628d93d759ae36106f7a738f66cb77badc79 (patch)
treeb9ab528ae4cfa2f4d7ac0fb90d7dd56512059b2c
parentc653de6c0f3722154a41cbb57c213a0cdd789419 (diff)
This Patch corrects a problem whereby the optimization to use a faster divide
instruction (for Intel Atom) was not being done by Clang, because the type context used by Clang is not the default context. It fixes the problem by getting the global context types for each div/rem instruction in order to compare them against the types in the BypassTypeMap. Tests for this will be done as a separate patch to Clang. Patch by Tyler Nowicki. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165126 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Transforms/Utils/BypassSlowDivision.cpp20
1 files changed, 15 insertions, 5 deletions
diff --git a/lib/Transforms/Utils/BypassSlowDivision.cpp b/lib/Transforms/Utils/BypassSlowDivision.cpp
index ac18b7d5a0..821b588112 100644
--- a/lib/Transforms/Utils/BypassSlowDivision.cpp
+++ b/lib/Transforms/Utils/BypassSlowDivision.cpp
@@ -238,14 +238,24 @@ bool llvm::bypassSlowDivision(Function &F,
if (!UseDivOp && !UseRemOp)
continue;
+ // Skip division on vector types, only optimize integer instructions
+ if (!J->getType()->isIntegerTy())
+ continue;
+
+ // Get same type in global context
+ IntegerType *T = cast<IntegerType>(J->getType());
+ IntegerType *GT = IntegerType::get(getGlobalContext(), T->getBitWidth());
+
// Continue if div/rem type is not bypassed
- DenseMap<Type *, Type *>::const_iterator BT =
- BypassTypeMap.find(J->getType());
- if (BT == BypassTypeMap.end())
+ DenseMap<Type *, Type *>::const_iterator BI = BypassTypeMap.find(GT);
+ if (BI == BypassTypeMap.end())
continue;
- IntegerType *BypassType = cast<IntegerType>(BT->second);
- MadeChange |= reuseOrInsertFastDiv(F, I, J, BypassType, UseDivOp,
+ // Get the bypass type in the original context
+ IntegerType *GBT = cast<IntegerType>(BI->second);
+ IntegerType *BT = IntegerType::get(J->getContext(), GBT->getBitWidth());
+
+ MadeChange |= reuseOrInsertFastDiv(F, I, J, BT, UseDivOp,
UseSignedOp, DivCache);
}