// X == 0 ? abs(X) : -abs(X) --> -abs(X)
// X == 0 ? -abs(X) : abs(X) --> abs(X)
- if (match(TrueVal, m_Intrinsic<Intrinsic::abs>(m_Value(X))) &&
- match(FalseVal, m_Neg(m_Intrinsic<Intrinsic::abs>(m_Specific(X)))))
+ if (match(TrueVal, m_Intrinsic<Intrinsic::abs>(m_Specific(CmpLHS))) &&
+ match(FalseVal, m_Neg(m_Intrinsic<Intrinsic::abs>(m_Specific(CmpLHS)))))
return FalseVal;
- if (match(TrueVal, m_Neg(m_Intrinsic<Intrinsic::abs>(m_Value(X)))) &&
- match(FalseVal, m_Intrinsic<Intrinsic::abs>(m_Specific(X))))
+ if (match(TrueVal,
+ m_Neg(m_Intrinsic<Intrinsic::abs>(m_Specific(CmpLHS)))) &&
+ match(FalseVal, m_Intrinsic<Intrinsic::abs>(m_Specific(CmpLHS))))
return FalseVal;
}
define i32 @select_abs_of_abs_eq_wrong(i32 %x, i32 %y) {
; CHECK-LABEL: @select_abs_of_abs_eq_wrong(
; CHECK-NEXT: [[ABS:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
-; CHECK-NEXT: ret i32 [[ABS]]
+; CHECK-NEXT: [[NEG:%.*]] = sub i32 0, [[ABS]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[Y:%.*]], 0
+; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 [[NEG]], i32 [[ABS]]
+; CHECK-NEXT: ret i32 [[SEL]]
;
%abs = call i32 @llvm.abs.i32(i32 %x, i1 false)
%neg = sub i32 0, %abs
; CHECK-LABEL: @select_nabs_of_abs_eq_wrong(
; CHECK-NEXT: [[ABS:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
; CHECK-NEXT: [[NEG:%.*]] = sub i32 0, [[ABS]]
-; CHECK-NEXT: ret i32 [[NEG]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[Y:%.*]], 0
+; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 [[ABS]], i32 [[NEG]]
+; CHECK-NEXT: ret i32 [[SEL]]
;
%abs = call i32 @llvm.abs.i32(i32 %x, i1 false)
%neg = sub i32 0, %abs