summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/PowerPC/PPCCTRLoops.cpp
diff options
context:
space:
mode:
authorHal Finkel <hfinkel@anl.gov>2013-06-07 22:16:19 +0000
committerHal Finkel <hfinkel@anl.gov>2013-06-07 22:16:19 +0000
commitfa5f6f74402bbad2f01699731bee9d79360730e6 (patch)
treea1aac1d04823b701dca23297fbaf603a55fd94cb /llvm/lib/Target/PowerPC/PPCCTRLoops.cpp
parent69cb7d40fde0fda469179f9f4e6cd2dfef7a31b4 (diff)
downloadbcm5719-llvm-fa5f6f74402bbad2f01699731bee9d79360730e6.tar.gz
bcm5719-llvm-fa5f6f74402bbad2f01699731bee9d79360730e6.zip
Disallow i64 div/rem in PPC32 counter loops
On PPC32, [su]div,rem on i64 types are transformed into runtime library function calls. As a result, they are not allowed in counter-based loops (the counter-loops verification pass caught this error; this change fixes PR16169). llvm-svn: 183581
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCCTRLoops.cpp')
-rw-r--r--llvm/lib/Target/PowerPC/PPCCTRLoops.cpp7
1 files changed, 7 insertions, 0 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCCTRLoops.cpp b/llvm/lib/Target/PowerPC/PPCCTRLoops.cpp
index d2dd848cafa..08247c289f3 100644
--- a/llvm/lib/Target/PowerPC/PPCCTRLoops.cpp
+++ b/llvm/lib/Target/PowerPC/PPCCTRLoops.cpp
@@ -338,6 +338,13 @@ bool PPCCTRLoops::mightUseCTR(const Triple &TT, BasicBlock *BB) {
CI->getDestTy()->getScalarType()->isIntegerTy(64))
))
return true;
+ } else if (TT.isArch32Bit() &&
+ J->getType()->getScalarType()->isIntegerTy(64) &&
+ (J->getOpcode() == Instruction::UDiv ||
+ J->getOpcode() == Instruction::SDiv ||
+ J->getOpcode() == Instruction::URem ||
+ J->getOpcode() == Instruction::SRem)) {
+ return true;
} else if (isa<IndirectBrInst>(J) || isa<InvokeInst>(J)) {
// On PowerPC, indirect jumps use the counter register.
return true;
OpenPOWER on IntegriCloud