diff options
author | Hal Finkel <hfinkel@anl.gov> | 2013-06-07 22:16:19 +0000 |
---|---|---|
committer | Hal Finkel <hfinkel@anl.gov> | 2013-06-07 22:16:19 +0000 |
commit | fa5f6f74402bbad2f01699731bee9d79360730e6 (patch) | |
tree | a1aac1d04823b701dca23297fbaf603a55fd94cb /llvm/lib/Target/PowerPC/PPCCTRLoops.cpp | |
parent | 69cb7d40fde0fda469179f9f4e6cd2dfef7a31b4 (diff) | |
download | bcm5719-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.cpp | 7 |
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; |