@@ -6323,6 +6323,34 @@ Value *GradientUtils::invertPointerM(Value *const oval, IRBuilder<> &BuilderM,
63236323 switch (II->getIntrinsicID ()) {
63246324 default :
63256325 goto end;
6326+ #if LLVM_VERSION_MAJOR >= 12
6327+ case Intrinsic::smax:
6328+ case Intrinsic::smin:
6329+ case Intrinsic::umax:
6330+ case Intrinsic::umin: {
6331+ Value *val0 = invertPointerM (II->getArgOperand (0 ), bb, nullShadow);
6332+ Value *val1 = invertPointerM (II->getArgOperand (1 ), bb, nullShadow);
6333+ assert (val0->getType () == val1->getType ());
6334+
6335+ auto rule = [&](Value *val0, Value *val1) {
6336+ Value *args[] = {val0, val1};
6337+ auto shadow = cast<CallInst>(
6338+ bb.CreateCall (II->getCalledFunction (), args,
6339+ II->getName () + " 'ipbi" ));
6340+ shadow->setAttributes (II->getAttributes ());
6341+ shadow->setCallingConv (II->getCallingConv ());
6342+ shadow->setTailCallKind (II->getTailCallKind ());
6343+ shadow->setDebugLoc (getNewFromOriginal (II->getDebugLoc ()));
6344+ return shadow;
6345+ };
6346+
6347+ Value *shadow = applyChainRule (II->getType (), bb, rule, val0, val1);
6348+
6349+ invertedPointers.insert (
6350+ std::make_pair ((const Value *)oval, InvertedPointerVH (this , shadow)));
6351+ return shadow;
6352+ }
6353+ #endif
63266354#if LLVM_VERSION_MAJOR < 20
63276355 case Intrinsic::nvvm_ldg_global_i:
63286356 case Intrinsic::nvvm_ldg_global_p:
@@ -6573,13 +6601,6 @@ end:;
65736601 return Constant::getNullValue (getShadowType (oval->getType ()));
65746602 }
65756603
6576- if (looseTypeAnalysis && oval->getType ()->isIntOrIntVectorTy ()) {
6577- auto *shadow = Constant::getNullValue (getShadowType (oval->getType ()));
6578- invertedPointers.insert (
6579- std::make_pair ((const Value *)oval, InvertedPointerVH (this , shadow)));
6580- return shadow;
6581- }
6582-
65836604 if (CustomErrorHandler) {
65846605 std::string str;
65856606 raw_string_ostream ss (str);
0 commit comments