@@ -232,6 +232,46 @@ class AdjointGenerator
232232 return B.CreateLoad (alloc);
233233 }
234234
235+ #if LLVM_VERSION_MAJOR >= 10
236+ void visitFreezeInst (llvm::FreezeInst &inst) {
237+ eraseIfUnused (inst);
238+ if (gutils->isConstantInstruction (&inst))
239+ return ;
240+ Value *orig_op0 = inst.getOperand (0 );
241+
242+ switch (Mode) {
243+ case DerivativeMode::ReverseModeCombined:
244+ case DerivativeMode::ReverseModeGradient: {
245+ IRBuilder<> Builder2 (inst.getParent ());
246+ getReverseBuilder (Builder2);
247+
248+ Value *idiff = diffe (&inst, Builder2);
249+ Value *dif1 = Builder2.CreateFreeze (idiff);
250+ setDiffe (&inst, Constant::getNullValue (inst.getType ()), Builder2);
251+ size_t size = 1 ;
252+ if (inst.getType ()->isSized ())
253+ size = (gutils->newFunc ->getParent ()->getDataLayout ().getTypeSizeInBits (
254+ orig_op0->getType ()) +
255+ 7 ) /
256+ 8 ;
257+ addToDiffe (orig_op0, dif1, Builder2, TR.addingType (size, orig_op0));
258+ return ;
259+ }
260+ case DerivativeMode::ForwardMode: {
261+ IRBuilder<> BuilderZ (&inst);
262+ getForwardBuilder (BuilderZ);
263+
264+ Value *idiff = diffe (orig_op0, BuilderZ);
265+ Value *dif1 = BuilderZ.CreateFreeze (idiff);
266+ setDiffe (&inst, dif1, BuilderZ);
267+ return ;
268+ }
269+ case DerivativeMode::ReverseModePrimal:
270+ return ;
271+ }
272+ }
273+ #endif
274+
235275 void visitInstruction (llvm::Instruction &inst) {
236276 // TODO explicitly handle all instructions rather than using the catch all
237277 // below
0 commit comments