/// <summary>
		///   Replace references to old parameters that have been split with the new local parameters that represents them.
		/// </summary>
		/// <param name="mergedParams"> </param>
		/// <param name="paramsRefMap"> </param>
		internal static void ReplaceSplitParametersReferences( Dictionary<Parameter, Parameter> localParamsMap,
		                                                       Dictionary<Parameter, List<Operand>> paramsRefMap )
		{
			foreach ( var it in localParamsMap )
			{
				Parameter curSrcParam = it.Key;

				if ( paramsRefMap.ContainsKey( curSrcParam ) )
				{
					Parameter dstParameter = it.Value;
					var srcParamRefs = paramsRefMap[ curSrcParam ];

					for ( int i = 0; i < srcParamRefs.Count; i++ )
					{
						Operand srcOperand = srcParamRefs[ i ];
						int dstOpMask;

						if ( srcOperand.Mask == (int)Operand.OpMask.All )
						{
							dstOpMask = GetParameterMaskByType( curSrcParam.Type );
						}
						else
						{
							dstOpMask = srcOperand.Mask;
						}

						//Replace the original source operand with a new operand the reference the new merged parameter
						srcOperand = new Operand( dstParameter, srcOperand.Semantic, dstOpMask, 0 );
					}
				}
			}
		}
		/// <summary>
		///   Replace references to old parameters with the new merged parameters.
		/// </summary>
		/// <param name="mergedParams"> </param>
		/// <param name="paramsRefMap"> </param>
		internal static void ReplaceParametersReferences( List<MergeParameter> mergedParams,
		                                                  Dictionary<Parameter, List<Operand>> paramsRefMap )
		{
			for ( int i = 0; i < mergedParams.Count; i++ )
			{
				MergeParameter curMergeParameter = mergedParams[ i ];
				int paramBitMaskOffset = 0;

				for ( int j = 0; j < curMergeParameter.SourceParameterCount; j++ )
				{
					Parameter curSrcParam = curMergeParameter.SourceParameter[ j ];

					//Case the source parameter has some references
					if ( paramsRefMap.ContainsKey( curSrcParam ) )
					{
						List<Operand> srcParamRefs = paramsRefMap[ curSrcParam ];
						Parameter dstParameter;

						//Case the source paramter is fully contained within the destination merged parameter.
						if ( curMergeParameter.GetSourceParameterMask( j ) == (int)Operand.OpMask.All )
						{
							dstParameter = curMergeParameter.GetDestinationParameter( (int)Operand.OpSemantic.InOut, i );

							for ( int op = 0; op < srcParamRefs.Count; op++ )
							{
								Operand srcOperand = srcParamRefs[ op ];
								int dstOpMask;

								if ( srcOperand.Mask == (int)Operand.OpMask.All )
								{
									//Case the merged parameter contains only one source - no point in adding special mask.
									if ( curMergeParameter.SourceParameterCount == 1 )
									{
										dstOpMask = (int)Operand.OpMask.All;
									}
									else
									{
										dstOpMask = GetParameterMaskByType( curSrcParam.Type ) << paramBitMaskOffset;
									}
								}
								else
								{
									dstOpMask = srcOperand.Mask << paramBitMaskOffset;
								}
								// Replace the original source operand with a new operand the reference the new merged parameter.						
								srcOperand = new Operand( dstParameter, srcOperand.Semantic, dstOpMask, 0 );
							}
						}
					}

					//Update the bit mask offset
					paramBitMaskOffset += GetParameterFloatCount( curSrcParam.Type );
				}
			}
		}