[LLVMdev] Let's get rid of neverHasSideEffects

Jakob Stoklund Olesen stoklund at 2pi.dk
Tue Aug 21 14:02:20 PDT 2012


All,

TableGen likes to infer the MCID::UnmodeledSideEffects flag from an instruction's pattern. When an instruction doesn't have a pattern, it is assumed to have side effects.

It's possible to override this behavior by setting neverHasSideEffects = 1.

It was originally the intention that most instructions have patterns, but that's not the way it worked out. It is often more convenient to use def : Pat<>, and sometimes custom instruction selection is required.

As a result, many instructions are defined without a pattern, and we often forget to set neverHasSideEffects = 1.

$ grep -c UnmodeledSideEffects lib/Target/*/*GenInstrInfo.inc
lib/Target/ARM/ARMGenInstrInfo.inc:727
lib/Target/X86/X86GenInstrInfo.inc:920

I don't think more than half of those UnmodeledSideEffects flags should be there.


I want to stop inferring instruction properties from patterns in TableGen. It has become very hard to read instruction definitions when some properties are inferred, but only half the time.

We can still use any patterns to emit TableGen warnings. If an instruction has a sideeffecting pattern, but hasSideEffects isn't set, TableGen should complain.

I can't just kill off the neverHasSideEffects flag, that could cause miscompilations by clearing the UnmodeledSideEffects bit on instructions that should have it.

Any suggestions for a clean transition? I was thinking about first adding a -Winfer flag that warns whenever TableGen infers a property that wasn't already set in the .td file.

/jakob




More information about the llvm-dev mailing list