mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-19 04:31:17 +00:00
Check InlineAsm clobbers in PPCCTRLoops
We don't need to reject all inline asm as using the counter register (most does not). Only those that explicitly clobber the counter register need to prevent the transformation. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@182191 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9f61e485e6
commit
bf0bc3b2a2
@ -33,6 +33,7 @@
|
||||
#include "llvm/Analysis/ScalarEvolutionExpander.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/DerivedTypes.h"
|
||||
#include "llvm/IR/InlineAsm.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/IntrinsicInst.h"
|
||||
#include "llvm/IR/Module.h"
|
||||
@ -148,6 +149,20 @@ bool PPCCTRLoops::mightUseCTR(const Triple &TT, BasicBlock *BB) {
|
||||
for (BasicBlock::iterator J = BB->begin(), JE = BB->end();
|
||||
J != JE; ++J) {
|
||||
if (CallInst *CI = dyn_cast<CallInst>(J)) {
|
||||
if (InlineAsm *IA = dyn_cast<InlineAsm>(CI->getCalledValue())) {
|
||||
// Inline ASM is okay, unless it clobbers the ctr register.
|
||||
InlineAsm::ConstraintInfoVector CIV = IA->ParseConstraints();
|
||||
for (unsigned i = 0, ie = CIV.size(); i < ie; ++i) {
|
||||
InlineAsm::ConstraintInfo &C = CIV[i];
|
||||
if (C.Type != InlineAsm::isInput)
|
||||
for (unsigned j = 0, je = C.Codes.size(); j < je; ++j)
|
||||
if (StringRef(C.Codes[j]).equals_lower("{ctr}"))
|
||||
return true;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!TM)
|
||||
return true;
|
||||
const TargetLowering *TLI = TM->getTargetLowering();
|
||||
|
38
test/CodeGen/PowerPC/ctrloop-asm.ll
Normal file
38
test/CodeGen/PowerPC/ctrloop-asm.ll
Normal file
@ -0,0 +1,38 @@
|
||||
target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64"
|
||||
target triple = "powerpc64-unknown-freebsd10.0"
|
||||
; RUN: llc < %s -march=ppc64 | FileCheck %s
|
||||
|
||||
define void @test1(i32 %c) nounwind {
|
||||
entry:
|
||||
br label %for.body
|
||||
|
||||
for.body: ; preds = %for.body, %entry
|
||||
%i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
|
||||
call void asm sideeffect "", "~{r5}"() nounwind
|
||||
%inc = add nsw i32 %i.01, 1
|
||||
%exitcond = icmp eq i32 %inc, 2048
|
||||
br i1 %exitcond, label %for.end, label %for.body
|
||||
|
||||
for.end: ; preds = %for.body
|
||||
ret void
|
||||
; CHECK: @test1
|
||||
; CHECK: mtctr
|
||||
}
|
||||
|
||||
define void @test2(i32 %c) nounwind {
|
||||
entry:
|
||||
br label %for.body
|
||||
|
||||
for.body: ; preds = %for.body, %entry
|
||||
%i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
|
||||
call void asm sideeffect "", "~{ctr}"() nounwind
|
||||
%inc = add nsw i32 %i.01, 1
|
||||
%exitcond = icmp eq i32 %inc, 2048
|
||||
br i1 %exitcond, label %for.end, label %for.body
|
||||
|
||||
for.end: ; preds = %for.body
|
||||
ret void
|
||||
; CHECK: @test2
|
||||
; CHECK-NOT: mtctr
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user