Fix Reassociate handling of constant in presence of undef float

http://reviews.llvm.org/D6993

llvm-svn: 226245
This commit is contained in:
Mehdi Amini 2015-01-16 03:00:58 +00:00
parent f1394d41f0
commit a1e86a9849
2 changed files with 31 additions and 3 deletions

View File

@ -917,10 +917,13 @@ void Reassociate::RewriteExprTree(BinaryOperator *I,
/// version of the value is returned, and BI is left pointing at the instruction
/// that should be processed next by the reassociation pass.
static Value *NegateValue(Value *V, Instruction *BI) {
if (ConstantFP *C = dyn_cast<ConstantFP>(V))
return ConstantExpr::getFNeg(C);
if (Constant *C = dyn_cast<Constant>(V))
if (Constant *C = dyn_cast<Constant>(V)) {
if (C->getType()->isFPOrFPVectorTy()) {
return ConstantExpr::getFNeg(C);
}
return ConstantExpr::getNeg(C);
}
// We are trying to expose opportunity for reassociation. One of the things
// that we want to do to achieve this is to push a negation as deep into an

View File

@ -0,0 +1,25 @@
; RUN: opt -reassociate %s -S -o - | FileCheck %s
; Reassociate pass used to crash on these example
define float @undef1() {
wrapper_entry:
; CHECK-LABEL: @undef1
; CHECK: ret float fadd (float undef, float fadd (float undef, float fadd (float fsub (float -0.000000e+00, float undef), float fsub (float -0.000000e+00, float undef))))
%0 = fadd fast float undef, undef
%1 = fsub fast float undef, %0
%2 = fadd fast float undef, %1
ret float %2
}
define void @undef2() {
wrapper_entry:
; CHECK-LABEL: @undef2
; CHECK: unreachable
%0 = fadd fast float undef, undef
%1 = fadd fast float %0, 1.000000e+00
%2 = fsub fast float %0, %1
%3 = fmul fast float %2, 2.000000e+00
unreachable
}