Skip to content

Commit a6f8d21

Browse files
committed
Adjust codegen parameters
Created using spr 1.3.5
2 parents 6168867 + 4038262 commit a6f8d21

File tree

5 files changed

+850
-469
lines changed

5 files changed

+850
-469
lines changed

llvm/lib/Target/Sparc/SparcISelLowering.cpp

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1757,9 +1757,6 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
17571757

17581758
setOperationAction(ISD::CTPOP, MVT::i64,
17591759
Subtarget->usePopc() ? Legal : Expand);
1760-
setOperationAction(ISD::CTTZ , MVT::i64, Expand);
1761-
setOperationAction(ISD::CTLZ, MVT::i64,
1762-
Subtarget->isVIS3() ? Legal : LibCall);
17631760
setOperationAction(ISD::BSWAP, MVT::i64, Expand);
17641761
setOperationAction(ISD::ROTL , MVT::i64, Expand);
17651762
setOperationAction(ISD::ROTR , MVT::i64, Expand);
@@ -1819,11 +1816,7 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
18191816
setOperationAction(ISD::FCOS , MVT::f32, Expand);
18201817
setOperationAction(ISD::FSINCOS, MVT::f32, Expand);
18211818
setOperationAction(ISD::FREM , MVT::f32, Expand);
1822-
setOperationAction(ISD::FMA , MVT::f32, Expand);
1823-
setOperationAction(ISD::CTTZ, MVT::i32,
1824-
Subtarget->isVIS3() ? Promote : Expand);
1825-
setOperationAction(ISD::CTLZ, MVT::i32,
1826-
Subtarget->isVIS3() ? Promote : LibCall);
1819+
setOperationAction(ISD::FMA, MVT::f32, Expand);
18271820
setOperationAction(ISD::ROTL , MVT::i32, Expand);
18281821
setOperationAction(ISD::ROTR , MVT::i32, Expand);
18291822
setOperationAction(ISD::BSWAP, MVT::i32, Expand);
@@ -1995,9 +1988,38 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
19951988
setOperationAction(ISD::READCYCLECOUNTER, MVT::i64, Custom);
19961989

19971990
if (Subtarget->isVIS3()) {
1998-
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i32, Promote);
1991+
setOperationAction(ISD::CTLZ, MVT::i32, Legal);
1992+
setOperationAction(ISD::CTLZ, MVT::i64, Legal);
1993+
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i32, Legal);
19991994
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i64, Legal);
2000-
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i32, Promote);
1995+
1996+
setOperationAction(ISD::CTTZ, MVT::i32,
1997+
Subtarget->is64Bit() ? Promote : Expand);
1998+
setOperationAction(ISD::CTTZ, MVT::i64, Expand);
1999+
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i32,
2000+
Subtarget->is64Bit() ? Promote : Expand);
2001+
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i64, Expand);
2002+
} else if (Subtarget->usePopc()) {
2003+
setOperationAction(ISD::CTLZ, MVT::i32, Expand);
2004+
setOperationAction(ISD::CTLZ, MVT::i64, Expand);
2005+
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i32, Expand);
2006+
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i64, Expand);
2007+
2008+
setOperationAction(ISD::CTTZ, MVT::i32, Expand);
2009+
setOperationAction(ISD::CTTZ, MVT::i64, Expand);
2010+
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i32, Expand);
2011+
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i64, Expand);
2012+
} else {
2013+
setOperationAction(ISD::CTLZ, MVT::i32, Expand);
2014+
setOperationAction(ISD::CTLZ, MVT::i64, Expand);
2015+
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i32,
2016+
Subtarget->is64Bit() ? Promote : LibCall);
2017+
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i64, LibCall);
2018+
2019+
// FIXME make these LibCalls.
2020+
setOperationAction(ISD::CTTZ, MVT::i32, Expand);
2021+
setOperationAction(ISD::CTTZ, MVT::i64, Expand);
2022+
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i32, Expand);
20012023
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i64, Expand);
20022024
}
20032025

@@ -3591,6 +3613,17 @@ bool SparcTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT,
35913613
return false;
35923614
}
35933615

3616+
bool SparcTargetLowering::isCtlzFast() const { return Subtarget->isVIS3(); }
3617+
3618+
bool SparcTargetLowering::isCheapToSpeculateCttz(Type *Ty) const {
3619+
// We lack native cttz, however,
3620+
// On 64-bit targets it is cheap to implement it in terms of popc.
3621+
if (Subtarget->is64Bit() && Subtarget->usePopc())
3622+
return true;
3623+
// Otherwise, implementing cttz in terms of ctlz is still cheap.
3624+
return isCheapToSpeculateCtlz(Ty);
3625+
}
3626+
35943627
// Override to disable global variable loading on Linux.
35953628
void SparcTargetLowering::insertSSPDeclarations(Module &M) const {
35963629
if (!Subtarget->isTargetLinux())

llvm/lib/Target/Sparc/SparcISelLowering.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,14 @@ namespace llvm {
210210
bool isFPImmLegal(const APFloat &Imm, EVT VT,
211211
bool ForCodeSize) const override;
212212

213+
bool isCtlzFast() const override;
214+
215+
bool isCheapToSpeculateCtlz(Type *Ty) const override {
216+
return isCtlzFast();
217+
}
218+
219+
bool isCheapToSpeculateCttz(Type *Ty) const override;
220+
213221
bool shouldInsertFencesForAtomic(const Instruction *I) const override {
214222
// FIXME: We insert fences for each atomics and generate
215223
// sub-optimal code for PSO/TSO. (Approximately nobody uses any

llvm/lib/Target/Sparc/SparcInstrVIS.td

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,13 @@ def : Pat<(i64 (adde i64:$lhs, i64:$rhs)), (ADDXCCC $lhs, $rhs)>;
309309

310310
def : Pat<(i64 (ctlz i64:$src)), (LZCNT $src)>;
311311
def : Pat<(i64 (ctlz_zero_undef i64:$src)), (LZCNT $src)>;
312+
// 32-bit LZCNT.
313+
// The zero extension will leave us with 32 extra leading zeros,
314+
// so we need to compensate for it.
315+
// FIXME remove this when the codegen supports using 64-bit values directly
316+
// in V8+ mode.
317+
def : Pat<(i32 (ctlz i32:$src)), (ADDri (LZCNT (SRLri $src, 0)), (i32 -32))>;
318+
def : Pat<(i32 (ctlz_zero_undef i32:$src)), (ADDri (LZCNT (SRLri $src, 0)), (i32 -32))>;
312319

313320
def : Pat<(i32 (bitconvert f32:$src)), (MOVSTOUW $src)>;
314321
def : Pat<(i64 (zanyext (i32 (bitconvert f32:$src)))), (MOVSTOUW $src)>;

0 commit comments

Comments
 (0)