Changes in directory llvm/lib/Target/PowerPC:
PPCISelLowering.cpp updated: 1.166 -> 1.167 --- Log message: Fix a crash on: void foo2(vector float *A, vector float *B) { vector float C = (vector float)vec_cmpeq(*A, *B); if (!vec_any_eq(*A, *B)) *B = (vector float){0,0,0,0}; *A = C; } --- Diffs of the changes: (+24 -2) PPCISelLowering.cpp | 26 ++++++++++++++++++++++++-- 1 files changed, 24 insertions(+), 2 deletions(-) Index: llvm/lib/Target/PowerPC/PPCISelLowering.cpp diff -u llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.166 llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.167 --- llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.166 Tue Apr 18 13:05:58 2006 +++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp Tue Apr 18 13:28:22 2006 @@ -2203,8 +2203,30 @@ break; } - // If there are non-zero uses of the flag value, use the VCMPo node! - if (VCMPoNode && !VCMPoNode->hasNUsesOfValue(0, 1)) + // If there is no VCMPo node, or if the flag value has a single use, don't + // transform this. + if (!VCMPoNode || VCMPoNode->hasNUsesOfValue(0, 1)) + break; + + // Look at the (necessarily single) use of the flag value. If it has a + // chain, this transformation is more complex. Note that multiple things + // could use the value result, which we should ignore. + SDNode *FlagUser = 0; + for (SDNode::use_iterator UI = VCMPoNode->use_begin(); + FlagUser == 0; ++UI) { + assert(UI != VCMPoNode->use_end() && "Didn't find user!"); + SDNode *User = *UI; + for (unsigned i = 0, e = User->getNumOperands(); i != e; ++i) { + if (User->getOperand(i) == SDOperand(VCMPoNode, 1)) { + FlagUser = User; + break; + } + } + } + + // If the user is a MFCR instruction, we know this is safe. Otherwise we + // give up for right now. + if (FlagUser->getOpcode() == PPCISD::MFCR) return SDOperand(VCMPoNode, 0); } break; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits