Skip to content

Commit 303ce4c

Browse files
committed
[InstCombine] Make sure all instructions have arcp and reassoc flags
1 parent f106f58 commit 303ce4c

File tree

2 files changed

+11
-9
lines changed

2 files changed

+11
-9
lines changed

llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1714,10 +1714,12 @@ static Instruction *foldFDivPowDivisor(BinaryOperator &I,
17141714
static Instruction *foldFDivSqrtDivisor(BinaryOperator &I,
17151715
InstCombiner::BuilderTy &Builder) {
17161716
// X / sqrt(Y / Z) --> X * sqrt(Z / Y)
1717+
if (!I.hasAllowReassoc() || !I.hasAllowReciprocal())
1718+
return nullptr;
17171719
Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
17181720
auto *II = dyn_cast<IntrinsicInst>(Op1);
17191721
if (!II || II->getIntrinsicID() != Intrinsic::sqrt || !II->hasOneUse() ||
1720-
!I.hasAllowReassoc() || !I.hasAllowReciprocal())
1722+
!II->hasAllowReassoc() || !II->hasAllowReciprocal())
17211723
return nullptr;
17221724

17231725
Value *Y, *Z;
@@ -1727,8 +1729,8 @@ static Instruction *foldFDivSqrtDivisor(BinaryOperator &I,
17271729
return nullptr;
17281730
if (match(DivOp, m_FDiv(m_Value(Y), m_Value(Z)))) {
17291731
Value *SwapDiv = Builder.CreateFDivFMF(Z, Y, DivOp);
1730-
Value *NewSqrt = Builder.CreateIntrinsic(II->getIntrinsicID(),
1731-
II->getType(), {SwapDiv}, II);
1732+
Value *NewSqrt =
1733+
Builder.CreateUnaryIntrinsic(II->getIntrinsicID(), SwapDiv, II);
17321734
return BinaryOperator::CreateFMulFMF(Op0, NewSqrt, &I);
17331735
}
17341736
return nullptr;

llvm/test/Transforms/InstCombine/fdiv-sqrt.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ entry:
6666
define double @sqrt_div_reassoc_missing2(double %x, double %y, double %z) {
6767
; CHECK-LABEL: @sqrt_div_reassoc_missing2(
6868
; CHECK-NEXT: entry:
69-
; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc arcp double [[Z:%.*]], [[Y:%.*]]
70-
; CHECK-NEXT: [[TMP1:%.*]] = call arcp double @llvm.sqrt.f64(double [[TMP0]])
71-
; CHECK-NEXT: [[DIV1:%.*]] = fmul reassoc arcp double [[TMP1]], [[X:%.*]]
69+
; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc arcp double [[Y:%.*]], [[Z:%.*]]
70+
; CHECK-NEXT: [[SQRT:%.*]] = call arcp double @llvm.sqrt.f64(double [[DIV]])
71+
; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc arcp double [[X:%.*]], [[SQRT]]
7272
; CHECK-NEXT: ret double [[DIV1]]
7373
;
7474
entry:
@@ -111,9 +111,9 @@ entry:
111111
define double @sqrt_div_arcp_missing2(double %x, double %y, double %z) {
112112
; CHECK-LABEL: @sqrt_div_arcp_missing2(
113113
; CHECK-NEXT: entry:
114-
; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc arcp double [[Z:%.*]], [[Y:%.*]]
115-
; CHECK-NEXT: [[TMP1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[TMP0]])
116-
; CHECK-NEXT: [[DIV1:%.*]] = fmul reassoc arcp double [[TMP1]], [[X:%.*]]
114+
; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc arcp double [[Y:%.*]], [[Z:%.*]]
115+
; CHECK-NEXT: [[SQRT:%.*]] = call reassoc double @llvm.sqrt.f64(double [[DIV]])
116+
; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc arcp double [[X:%.*]], [[SQRT]]
117117
; CHECK-NEXT: ret double [[DIV1]]
118118
;
119119
entry:

0 commit comments

Comments
 (0)