Inst->replaceAllUsesWith and uses in ConstantExpr

Hello all,

From what I have observed, using Inst->replaceAllUsesWith does not replace uses of the Inst in ConstantExprs. Is there some way to have a universal replaceAllUsesWith?


Where are you seeing instructions used in ConstantExprs? That sounds
really dodgy to me. Instructions are horribly non-Constant so I'd have
thought it would be banned (even for technically plausible things like
"and(i32 %inst, 0)").



Whoops, sorry, I meant “value->replaceAllUsesWith”.

Should I create a new post with an updated title?


ConstantExprs are immutable, they can’t be changed once they are created. And a ConstantExpr can reference other ConstantExprs. So replacing all uses of a Value in a ConstantExpr would require creating a new immutable object for each ConstantExpr that references the one you’re changing. And that would continue rippling outward.

I see. Is there a pre-existing way to do this in LLVM?


Perhaps to provide a short explanation why you want to RAUW ConstantExpr’s. Then others are likely to be able to provide you with more useful feedback for how you can accomplish your goal.


does anybody know about a backend for IL according to 61131-3?
If there is no, what do you think, is it technically possible to write one and how much effort does this mean?
I’m new to all this stuff of llvm and so on, but it seems for me that IL is quite similar to assembler.

Best Regards

Sure. Essentially, I’m trying to replace malloc and free with custom variants of these calls. However, in certain situations, we receive these calls within bitcasts, for example,

call void bitcast (void (i8*)* @free to void (%struct.fson_string*))
%13) #2

A simple replaceAllUsesWith is not going to work, because the @free is within a bitcast, which is a ConstantExpr. Unless I did something wrong, this particular occurence of @free was not replaced even when I called replaceAllUsesOf on the @free object.

I currently have a really hacky way of achieving this: I expand every ConstantExpr that uses this Value into Instructions, on which I then call replaceUsesOfWith.

However, a neater solution would be appreciated.


You likely did something wrong; clang does this all the time, and it works. See, for example, CodeGenModule::GetOrCreateLLVMGlobal. -Eli