Are Module / Function / Instruction iteration orders stable?

Hi guys,

Suppose I have an IR file on disk, and I access it via a Module pass. Also suppose that the bitcode file hasn’t changed, and no transformation passes have run.

Then can I safely assume that every time my Module pass executes code like the following, it will always visit the Module’s Functions, BasicBlocks, and Instructions in the same order?

for (auto const & Fn : Module) {
for (auto const & BB : Fn) {
for (auto const & Ins : BB) {
}
}
}

I don’t notice anything in the LLVM docs suggesting that I can count on the order staying the same when visiting a Module’s Functions or a Function’s BasicBlocks. But I’m told there was an IRC post the other day stating that the order is stable.

Thanks, Christian

These specific things *should* be stable.
The use order is not stable, however.

These specific things *should* be stable.

(Agreed.)

The use order is not stable, however.

A fronted can opt-in to stable use-list ordering. `clang -cc1` has an
`-emit-llvm-uselists` option that turns this on. The clang driver
uses that for `clang -save-temps`, for example.

The use-list order is only guaranteed to be stable if the reader/writer
are the exact same version; otherwise it can degrade.