Ban rematerializable instructions with side effects.

TableGen infers unmodeled side effects on instructions without a
pattern.  Fix some instruction definitions where that was overlooked.

Also raise an error if a rematerializable instruction has unmodeled side
effects. That doen't make any sense.

llvm-svn: 141929
This commit is contained in:
Jakob Stoklund Olesen 2011-10-14 01:00:49 +00:00
parent 4c3e140247
commit d9444d455e
5 changed files with 19 additions and 11 deletions

View File

@ -312,7 +312,7 @@ def tPICADD : TIt<(outs GPR:$dst), (ins GPR:$lhs, pclabel:$cp), IIC_iALUr, "",
// ADD <Rd>, sp, #<imm8>
// This is rematerializable, which is particularly useful for taking the
// address of locals.
let isReMaterializable = 1 in
let isReMaterializable = 1, neverHasSideEffects = 1 in
def tADDrSPi : T1pI<(outs tGPR:$dst), (ins GPRsp:$sp, t_imm0_1020s4:$imm),
IIC_iALUi, "add", "\t$dst, $sp, $imm", []>,
T1Encoding<{1,0,1,0,1,?}> {

View File

@ -442,17 +442,19 @@ let Predicates=[HasMul] in {
//===----------------------------------------------------------------------===//
let canFoldAsLoad = 1, isReMaterializable = 1 in {
def LBU : LoadM<0x30, 0x000, "lbu ">;
def LBUR : LoadM<0x30, 0x200, "lbur ">;
let neverHasSideEffects = 1 in {
def LBU : LoadM<0x30, 0x000, "lbu ">;
def LBUR : LoadM<0x30, 0x200, "lbur ">;
def LHU : LoadM<0x31, 0x000, "lhu ">;
def LHUR : LoadM<0x31, 0x200, "lhur ">;
def LHU : LoadM<0x31, 0x000, "lhu ">;
def LHUR : LoadM<0x31, 0x200, "lhur ">;
def LW : LoadM<0x32, 0x000, "lw ">;
def LWR : LoadM<0x32, 0x200, "lwr ">;
def LW : LoadM<0x32, 0x000, "lw ">;
def LWR : LoadM<0x32, 0x200, "lwr ">;
let Defs = [CARRY] in {
def LWX : LoadM<0x32, 0x400, "lwx ">;
let Defs = [CARRY] in {
def LWX : LoadM<0x32, 0x400, "lwx ">;
}
}
def LBUI : LoadMI<0x38, "lbui ", zextloadi8>;

View File

@ -478,7 +478,7 @@ def MOV64rmm : RSYI<0x04EB,
"lmg\t{$from, $to, $dst}",
[]>;
let isReMaterializable = 1, isAsCheapAsAMove = 1,
let isReMaterializable = 1, neverHasSideEffects = 1, isAsCheapAsAMove = 1,
Constraints = "$src = $dst" in {
def MOV64Pr0_even : Pseudo<(outs GR64P:$dst), (ins GR64P:$src),
"lhi\t${dst:subreg_even}, 0",

View File

@ -967,7 +967,7 @@ let mayStore = 1 in
def MOV8mr_NOREX : I<0x88, MRMDestMem,
(outs), (ins i8mem_NOREX:$dst, GR8_NOREX:$src),
"mov{b}\t{$src, $dst|$dst, $src} # NOREX", []>;
let mayLoad = 1,
let mayLoad = 1, neverHasSideEffects = 1,
canFoldAsLoad = 1, isReMaterializable = 1 in
def MOV8rm_NOREX : I<0x8A, MRMSrcMem,
(outs GR8_NOREX:$dst), (ins i8mem_NOREX:$src),

View File

@ -2829,6 +2829,12 @@ void CodeGenDAGPatterns::InferInstructionFlags() {
InstInfo.isBitcast = IsBitcast;
InstInfo.hasSideEffects = HasSideEffects;
InstInfo.Operands.isVariadic = IsVariadic;
// Sanity checks.
if (InstInfo.isReMaterializable && InstInfo.hasSideEffects)
throw TGError(InstInfo.TheDef->getLoc(), "The instruction " +
InstInfo.TheDef->getName() +
" is rematerializable AND has unmodeled side effects?");
}
}