From 2b97f9b21108b3bff00f5d3c60cb6eeb97747e24 Mon Sep 17 00:00:00 2001 From: Juergen Ributzka Date: Thu, 13 Feb 2014 04:19:26 +0000 Subject: [DAG] Fix the recognition of opaque constants in the SelectionDAGBuilder. This fix checks the original LLVM IR node to identify opaque constants by looking for the bitcast-constant pattern. Originally we looked at the generated SDNode, but this might lead to incorrect results. The SDNode could have been generated by an constant expression that was folded to a constant. This fixes llvm-svn: 201291 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp') diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 3d51e9ede95..a7c99849058 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -2996,9 +2996,13 @@ void SelectionDAGBuilder::visitBitCast(const User &I) { if (DestVT != N.getValueType()) setValue(&I, DAG.getNode(ISD::BITCAST, getCurSDLoc(), DestVT, N)); // convert types. - else if(ConstantSDNode *C = dyn_cast(N)) - setValue(&I, DAG.getConstant(C->getAPIntValue(), C->getValueType(0), - /*isTarget=*/false, /*isOpaque*/true)); + // Check if the original LLVM IR Operand was a ConstantInt, because getValue() + // might fold any kind of constant expression to an integer constant and that + // is not what we are looking for. Only regcognize a bitcast of a genuine + // constant integer as an opaque constant. + else if(ConstantInt *C = dyn_cast(I.getOperand(0))) + setValue(&I, DAG.getConstant(C->getValue(), DestVT, /*isTarget=*/false, + /*isOpaque*/true)); else setValue(&I, N); // noop cast. } -- cgit v1.2.3