diff --git a/llvm/lib/IR/Constants.cpp b/llvm/lib/IR/Constants.cpp --- a/llvm/lib/IR/Constants.cpp +++ b/llvm/lib/IR/Constants.cpp @@ -89,8 +89,13 @@ return CI->isZero(); // +0.0 is null. - if (const ConstantFP *CFP = dyn_cast(this)) + if (const ConstantFP *CFP = dyn_cast(this)) { + // ppc_fp128 determine isZero using high order double only + // Should check the bitwise value to make sure all bits are zero. + if (CFP->getType()->isPPC_FP128Ty()) + return CFP->isExactlyValue(+0.0); return CFP->isZero() && !CFP->isNegative(); + } // constant zero is zero for aggregates, cpnull is null for pointers, none for // tokens. diff --git a/llvm/test/CodeGen/PowerPC/ppc_fp128-bcwriter.ll b/llvm/test/CodeGen/PowerPC/ppc_fp128-bcwriter.ll --- a/llvm/test/CodeGen/PowerPC/ppc_fp128-bcwriter.ll +++ b/llvm/test/CodeGen/PowerPC/ppc_fp128-bcwriter.ll @@ -1,7 +1,7 @@ ; RUN: llvm-as < %s -o - | llvm-dis - | FileCheck %s ;CHECK-LABEL: main -;CHECK: store ppc_fp128 0xM0000000000000000000000000000000 +;CHECK: store ppc_fp128 0xM0000000000000000FFFFFFFFFFFFFFFF define i32 @main() local_unnamed_addr { _main_entry: