aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/Target.td
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-01-10 07:59:24 +0000
committerChris Lattner <sabre@nondot.org>2008-01-10 07:59:24 +0000
commitba7e756c22446a17a72632b8d4ac66cbdaab33f7 (patch)
tree35b58e8e83a49bdd3f3449e138228e57cacb0b77 /lib/Target/Target.td
parent1778a1590125dbef01b8d85128a11b6fb212b26f (diff)
Start inferring side effect information more aggressively, and fix many bugs in the
x86 backend where instructions were not marked maystore/mayload, and perf issues where instructions were not marked neverHasSideEffects. It would be really nice if we could write patterns for copy instructions. I have audited all the x86 instructions down to MOVDQAmr. The flags on others and on other targets are probably not right in all cases, but no clients currently use this info that are enabled by default. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45829 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/Target.td')
-rw-r--r--lib/Target/Target.td15
1 files changed, 9 insertions, 6 deletions
diff --git a/lib/Target/Target.td b/lib/Target/Target.td
index 766966f550..d155e713c0 100644
--- a/lib/Target/Target.td
+++ b/lib/Target/Target.td
@@ -204,19 +204,20 @@ class Instruction {
bit hasCtrlDep = 0; // Does this instruction r/w ctrl-flow chains?
bit isNotDuplicable = 0; // Is it unsafe to duplicate this instruction?
- // Side effect flags - If neither of these flags is set, then the instruction
- // *always* has side effects. When set, the flags have these meanings:
+ // Side effect flags - When set, the flags have these meanings:
//
- // neverHasSideEffects - The instruction has no side effects that are not
- // captured by any operands of the instruction or other flags, and when
- // *all* instances of the instruction of that opcode have no side effects.
+ // hasSideEffects - The instruction has side effects that are not
+ // captured by any operands of the instruction or other flags.
// mayHaveSideEffects - Some instances of the instruction can have side
// effects. The virtual method "isReallySideEffectFree" is called to
// determine this. Load instructions are an example of where this is
// useful. In general, loads always have side effects. However, loads from
// constant pools don't. Individual back ends make this determination.
- bit neverHasSideEffects = 0;
+ // neverHasSideEffects - Set on an instruction with no pattern if it has no
+ // side effects.
+ bit hasSideEffects = 0;
bit mayHaveSideEffects = 0;
+ bit neverHasSideEffects = 0;
InstrItinClass Itinerary = NoItinerary;// Execution steps used for scheduling.
@@ -343,12 +344,14 @@ def EXTRACT_SUBREG : Instruction {
let InOperandList = (ops variable_ops);
let AsmString = "";
let Namespace = "TargetInstrInfo";
+ let neverHasSideEffects = 1;
}
def INSERT_SUBREG : Instruction {
let OutOperandList = (ops variable_ops);
let InOperandList = (ops variable_ops);
let AsmString = "";
let Namespace = "TargetInstrInfo";
+ let neverHasSideEffects = 1;
}
//===----------------------------------------------------------------------===//