Promote MVT::f32 load/store to MVT::i32 cause infinite loop in LegalizeDAG?

On my target store/load of f32 or i32 are equivalents.
Previously I had duplicate instructions def in .td to map f32 and i32 to the same opcode.

I deleted all that and I instead tried a new approach (to simplify things) :

setOperationAction(ISD::STORE, MVT::f32, Promote);
AddPromotedToType(ISD::STORE, MVT::f32, MVT::i32);
setOperationAction(ISD::LOAD, MVT::f32, Promote);

AddPromotedToType(ISD::LOAD, MVT::f32, MVT::i32);

Now SelectionDAGLegalize::LegalizeDAG() get stuck into an infinite loop. What is going on?

I still have the following:(but I think that’s fine)

addRegisterClass(MVT::f32, &Opus::GR32RegClass);


(My LLVM is ~3 months old)

Have you specified a register class for MVT::i32? If not, I think that
may be your problem.


Yes I have, f32 and i32 map to the same register class:
  addRegisterClass(MVT::i32, &Opus::GR32RegClass);

Ok, that's strange. You may have to step through the code to see what
is happening. The R600 target does the exact same promotion with f32
loads and stores (see R600ISelLowering.cpp), and it works fine, so you
may want to compare and see what you are doing differently.