Don't form PPC CTR-based loops around a copysignl call

copysign/copysignf never become function calls (because the SDAG expansion code
does not lower to the corresponding function call, but rather directly
implements the associated logic), but copysignl almost always is lowered into a
call to the requested libm functon (and, thus, might clobber CTR).

llvm-svn: 188727
This commit is contained in:
Hal Finkel 2013-08-19 23:35:24 +00:00
parent 4612fed911
commit 1cf48ab811
2 changed files with 30 additions and 1 deletions

View File

@ -284,8 +284,9 @@ bool PPCCTRLoops::mightUseCTR(const Triple &TT, BasicBlock *BB) {
default: return true; default: return true;
case LibFunc::copysign: case LibFunc::copysign:
case LibFunc::copysignf: case LibFunc::copysignf:
case LibFunc::copysignl:
continue; // ISD::FCOPYSIGN is never a library call. continue; // ISD::FCOPYSIGN is never a library call.
case LibFunc::copysignl:
return true;
case LibFunc::fabs: case LibFunc::fabs:
case LibFunc::fabsf: case LibFunc::fabsf:
case LibFunc::fabsl: case LibFunc::fabsl:

View File

@ -0,0 +1,28 @@
; RUN: llc < %s -mcpu=ppc | FileCheck %s
target datalayout = "E-p:32:32:32-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"
target triple = "powerpc-unknown-linux-gnu"
define ppc_fp128 @foo(ppc_fp128* nocapture %n, ppc_fp128 %d) nounwind readonly {
entry:
br label %for.body
for.body: ; preds = %for.body, %entry
%i.06 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
%x.05 = phi ppc_fp128 [ %d, %entry ], [ %conv, %for.body ]
%arrayidx = getelementptr inbounds ppc_fp128* %n, i32 %i.06
%0 = load ppc_fp128* %arrayidx, align 8
%conv = tail call ppc_fp128 @copysignl(ppc_fp128 %x.05, ppc_fp128 %d) nounwind readonly
%inc = add nsw i32 %i.06, 1
%exitcond = icmp eq i32 %inc, 2048
br i1 %exitcond, label %for.end, label %for.body
for.end: ; preds = %for.body
ret ppc_fp128 %conv
}
declare ppc_fp128 @copysignl(ppc_fp128, ppc_fp128) #0
; CHECK: @foo
; CHECK-NOT: mtctr