Skip to content

Commit 0dc013f

Browse files
committed
Address feedback for DXILIntrinsicExpansion.cpp
1 parent ebf80f9 commit 0dc013f

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

llvm/lib/Target/DirectX/DXILIntrinsicExpansion.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -313,37 +313,43 @@ static Value *expandAtan2Intrinsic(CallInst *Orig) {
313313
Value *X = Orig->getOperand(1);
314314
Type *Ty = X->getType();
315315
IRBuilder<> Builder(Orig);
316+
Builder.setFastMathFlags(Orig->getFastMathFlags());
316317

317318
Value *Tan = Builder.CreateFDiv(Y, X);
318319

319-
Value *Atan =
320+
CallInst *Atan =
320321
Builder.CreateIntrinsic(Ty, Intrinsic::atan, {Tan}, nullptr, "Elt.Atan");
322+
Atan->setTailCall(Orig->isTailCall());
323+
Atan->setAttributes(Orig->getAttributes());
321324

325+
// Modify atan result based on https://en.wikipedia.org/wiki/Atan2.
322326
Constant *Pi = ConstantFP::get(Ty, llvm::numbers::pi);
323327
Constant *HalfPi = ConstantFP::get(Ty, llvm::numbers::pi / 2);
324328
Constant *NegHalfPi = ConstantFP::get(Ty, -llvm::numbers::pi / 2);
325329
Constant *Zero = ConstantFP::get(Ty, 0);
326-
327330
Value *AtanAddPi = Builder.CreateFAdd(Atan, Pi);
328331
Value *AtanSubPi = Builder.CreateFSub(Atan, Pi);
329332

333+
// x > 0 -> atan.
330334
Value *Result = Atan;
331-
332335
Value *XLt0 = Builder.CreateFCmpOLT(X, Zero);
333336
Value *XEq0 = Builder.CreateFCmpOEQ(X, Zero);
334-
335337
Value *YGe0 = Builder.CreateFCmpOGE(Y, Zero);
336338
Value *YLt0 = Builder.CreateFCmpOLT(Y, Zero);
337339

340+
// x < 0, y >= 0 -> atan + pi.
338341
Value *XLt0AndYGe0 = Builder.CreateAnd(XLt0, YGe0);
339342
Result = Builder.CreateSelect(XLt0AndYGe0, AtanAddPi, Result);
340343

344+
// x < 0, y < 0 -> atan - pi.
341345
Value *XLt0AndYLt0 = Builder.CreateAnd(XLt0, YLt0);
342346
Result = Builder.CreateSelect(XLt0AndYLt0, AtanSubPi, Result);
343347

348+
// x == 0, y < 0 -> -pi/2
344349
Value *XEq0AndYLt0 = Builder.CreateAnd(XEq0, YLt0);
345350
Result = Builder.CreateSelect(XEq0AndYLt0, NegHalfPi, Result);
346351

352+
// x == 0, y > 0 -> pi/2
347353
Value *XEq0AndYGe0 = Builder.CreateAnd(XEq0, YGe0);
348354
Result = Builder.CreateSelect(XEq0AndYGe0, HalfPi, Result);
349355

0 commit comments

Comments
 (0)