forked from OSchip/llvm-project
				
			Propagate DAG node ordering during type legalization and instruction selection
A node's ordering is only propagated during legalization if (a) the new node does not have an ordering (is not a CSE'd node), or (b) the new node has an ordering that is higher than the node being legalized. llvm-svn: 177465
This commit is contained in:
		
							parent
							
								
									761b5cf087
								
							
						
					
					
						commit
						d068943809
					
				| 
						 | 
					@ -619,6 +619,17 @@ void DAGTypeLegalizer::RemapValue(SDValue &N) {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// PropagateOrdering - Propagate SDNode ordering information from \p Old to
 | 
				
			||||||
 | 
					/// \p New. Generally, this just means copying the ordering value, but if the
 | 
				
			||||||
 | 
					/// new node is actually a recycled node with a lower ordering already, then
 | 
				
			||||||
 | 
					/// we do not want to propagate the new (higher) ordering.
 | 
				
			||||||
 | 
					void DAGTypeLegalizer::PropagateOrdering(SDNode *Old, SDNode *New) {
 | 
				
			||||||
 | 
					  unsigned OldOrder = DAG.GetOrdering(Old);
 | 
				
			||||||
 | 
					  unsigned NewOrder = DAG.GetOrdering(New);
 | 
				
			||||||
 | 
					  if (NewOrder == 0 || (NewOrder > 0 && OldOrder < NewOrder))
 | 
				
			||||||
 | 
					    DAG.AssignOrdering(New, OldOrder);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace {
 | 
					namespace {
 | 
				
			||||||
  /// NodeUpdateListener - This class is a DAGUpdateListener that listens for
 | 
					  /// NodeUpdateListener - This class is a DAGUpdateListener that listens for
 | 
				
			||||||
  /// updates to nodes and recomputes their ready state.
 | 
					  /// updates to nodes and recomputes their ready state.
 | 
				
			||||||
| 
						 | 
					@ -735,6 +746,9 @@ void DAGTypeLegalizer::SetPromotedInteger(SDValue Op, SDValue Result) {
 | 
				
			||||||
  SDValue &OpEntry = PromotedIntegers[Op];
 | 
					  SDValue &OpEntry = PromotedIntegers[Op];
 | 
				
			||||||
  assert(OpEntry.getNode() == 0 && "Node is already promoted!");
 | 
					  assert(OpEntry.getNode() == 0 && "Node is already promoted!");
 | 
				
			||||||
  OpEntry = Result;
 | 
					  OpEntry = Result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Propagate node ordering
 | 
				
			||||||
 | 
					  PropagateOrdering(Op.getNode(), Result.getNode());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DAGTypeLegalizer::SetSoftenedFloat(SDValue Op, SDValue Result) {
 | 
					void DAGTypeLegalizer::SetSoftenedFloat(SDValue Op, SDValue Result) {
 | 
				
			||||||
| 
						 | 
					@ -746,6 +760,9 @@ void DAGTypeLegalizer::SetSoftenedFloat(SDValue Op, SDValue Result) {
 | 
				
			||||||
  SDValue &OpEntry = SoftenedFloats[Op];
 | 
					  SDValue &OpEntry = SoftenedFloats[Op];
 | 
				
			||||||
  assert(OpEntry.getNode() == 0 && "Node is already converted to integer!");
 | 
					  assert(OpEntry.getNode() == 0 && "Node is already converted to integer!");
 | 
				
			||||||
  OpEntry = Result;
 | 
					  OpEntry = Result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Propagate node ordering
 | 
				
			||||||
 | 
					  PropagateOrdering(Op.getNode(), Result.getNode());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DAGTypeLegalizer::SetScalarizedVector(SDValue Op, SDValue Result) {
 | 
					void DAGTypeLegalizer::SetScalarizedVector(SDValue Op, SDValue Result) {
 | 
				
			||||||
| 
						 | 
					@ -760,6 +777,9 @@ void DAGTypeLegalizer::SetScalarizedVector(SDValue Op, SDValue Result) {
 | 
				
			||||||
  SDValue &OpEntry = ScalarizedVectors[Op];
 | 
					  SDValue &OpEntry = ScalarizedVectors[Op];
 | 
				
			||||||
  assert(OpEntry.getNode() == 0 && "Node is already scalarized!");
 | 
					  assert(OpEntry.getNode() == 0 && "Node is already scalarized!");
 | 
				
			||||||
  OpEntry = Result;
 | 
					  OpEntry = Result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Propagate node ordering
 | 
				
			||||||
 | 
					  PropagateOrdering(Op.getNode(), Result.getNode());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DAGTypeLegalizer::GetExpandedInteger(SDValue Op, SDValue &Lo,
 | 
					void DAGTypeLegalizer::GetExpandedInteger(SDValue Op, SDValue &Lo,
 | 
				
			||||||
| 
						 | 
					@ -787,6 +807,10 @@ void DAGTypeLegalizer::SetExpandedInteger(SDValue Op, SDValue Lo,
 | 
				
			||||||
  assert(Entry.first.getNode() == 0 && "Node already expanded");
 | 
					  assert(Entry.first.getNode() == 0 && "Node already expanded");
 | 
				
			||||||
  Entry.first = Lo;
 | 
					  Entry.first = Lo;
 | 
				
			||||||
  Entry.second = Hi;
 | 
					  Entry.second = Hi;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Propagate ordering
 | 
				
			||||||
 | 
					  PropagateOrdering(Op.getNode(), Lo.getNode());
 | 
				
			||||||
 | 
					  PropagateOrdering(Op.getNode(), Hi.getNode());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DAGTypeLegalizer::GetExpandedFloat(SDValue Op, SDValue &Lo,
 | 
					void DAGTypeLegalizer::GetExpandedFloat(SDValue Op, SDValue &Lo,
 | 
				
			||||||
| 
						 | 
					@ -814,6 +838,10 @@ void DAGTypeLegalizer::SetExpandedFloat(SDValue Op, SDValue Lo,
 | 
				
			||||||
  assert(Entry.first.getNode() == 0 && "Node already expanded");
 | 
					  assert(Entry.first.getNode() == 0 && "Node already expanded");
 | 
				
			||||||
  Entry.first = Lo;
 | 
					  Entry.first = Lo;
 | 
				
			||||||
  Entry.second = Hi;
 | 
					  Entry.second = Hi;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Propagate ordering
 | 
				
			||||||
 | 
					  PropagateOrdering(Op.getNode(), Lo.getNode());
 | 
				
			||||||
 | 
					  PropagateOrdering(Op.getNode(), Hi.getNode());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DAGTypeLegalizer::GetSplitVector(SDValue Op, SDValue &Lo,
 | 
					void DAGTypeLegalizer::GetSplitVector(SDValue Op, SDValue &Lo,
 | 
				
			||||||
| 
						 | 
					@ -843,6 +871,10 @@ void DAGTypeLegalizer::SetSplitVector(SDValue Op, SDValue Lo,
 | 
				
			||||||
  assert(Entry.first.getNode() == 0 && "Node already split");
 | 
					  assert(Entry.first.getNode() == 0 && "Node already split");
 | 
				
			||||||
  Entry.first = Lo;
 | 
					  Entry.first = Lo;
 | 
				
			||||||
  Entry.second = Hi;
 | 
					  Entry.second = Hi;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Propagate ordering
 | 
				
			||||||
 | 
					  PropagateOrdering(Op.getNode(), Lo.getNode());
 | 
				
			||||||
 | 
					  PropagateOrdering(Op.getNode(), Hi.getNode());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DAGTypeLegalizer::SetWidenedVector(SDValue Op, SDValue Result) {
 | 
					void DAGTypeLegalizer::SetWidenedVector(SDValue Op, SDValue Result) {
 | 
				
			||||||
| 
						 | 
					@ -854,6 +886,9 @@ void DAGTypeLegalizer::SetWidenedVector(SDValue Op, SDValue Result) {
 | 
				
			||||||
  SDValue &OpEntry = WidenedVectors[Op];
 | 
					  SDValue &OpEntry = WidenedVectors[Op];
 | 
				
			||||||
  assert(OpEntry.getNode() == 0 && "Node already widened!");
 | 
					  assert(OpEntry.getNode() == 0 && "Node already widened!");
 | 
				
			||||||
  OpEntry = Result;
 | 
					  OpEntry = Result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Propagate node ordering
 | 
				
			||||||
 | 
					  PropagateOrdering(Op.getNode(), Result.getNode());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -919,8 +954,11 @@ bool DAGTypeLegalizer::CustomLowerNode(SDNode *N, EVT VT, bool LegalizeResult) {
 | 
				
			||||||
  // Make everything that once used N's values now use those in Results instead.
 | 
					  // Make everything that once used N's values now use those in Results instead.
 | 
				
			||||||
  assert(Results.size() == N->getNumValues() &&
 | 
					  assert(Results.size() == N->getNumValues() &&
 | 
				
			||||||
         "Custom lowering returned the wrong number of results!");
 | 
					         "Custom lowering returned the wrong number of results!");
 | 
				
			||||||
  for (unsigned i = 0, e = Results.size(); i != e; ++i)
 | 
					  for (unsigned i = 0, e = Results.size(); i != e; ++i) {
 | 
				
			||||||
    ReplaceValueWith(SDValue(N, i), Results[i]);
 | 
					    ReplaceValueWith(SDValue(N, i), Results[i]);
 | 
				
			||||||
 | 
					    // Propagate node ordering
 | 
				
			||||||
 | 
					    DAG.AssignOrdering(Results[i].getNode(), DAG.GetOrdering(N));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  return true;
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -143,6 +143,7 @@ private:
 | 
				
			||||||
  void ExpungeNode(SDNode *N);
 | 
					  void ExpungeNode(SDNode *N);
 | 
				
			||||||
  void PerformExpensiveChecks();
 | 
					  void PerformExpensiveChecks();
 | 
				
			||||||
  void RemapValue(SDValue &N);
 | 
					  void RemapValue(SDValue &N);
 | 
				
			||||||
 | 
					  void PropagateOrdering(SDNode *Old, SDNode *New);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Common routines.
 | 
					  // Common routines.
 | 
				
			||||||
  SDValue BitConvertToInteger(SDValue Op);
 | 
					  SDValue BitConvertToInteger(SDValue Op);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -785,8 +785,10 @@ void SelectionDAGISel::DoInstructionSelection() {
 | 
				
			||||||
      if (ResNode == Node || Node->getOpcode() == ISD::DELETED_NODE)
 | 
					      if (ResNode == Node || Node->getOpcode() == ISD::DELETED_NODE)
 | 
				
			||||||
        continue;
 | 
					        continue;
 | 
				
			||||||
      // Replace node.
 | 
					      // Replace node.
 | 
				
			||||||
      if (ResNode)
 | 
					      if (ResNode) {
 | 
				
			||||||
 | 
					        CurDAG->AssignOrdering(ResNode, CurDAG->GetOrdering(Node));
 | 
				
			||||||
        ReplaceUses(Node, ResNode);
 | 
					        ReplaceUses(Node, ResNode);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // If after the replacement this node is not used any more,
 | 
					      // If after the replacement this node is not used any more,
 | 
				
			||||||
      // remove this dead node.
 | 
					      // remove this dead node.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					; Ensure source scheduling is working
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define void @foo(i32* %a) {
 | 
				
			||||||
 | 
					; CHECK: .func foo
 | 
				
			||||||
 | 
					; CHECK: ld.u32
 | 
				
			||||||
 | 
					; CHECK-NEXT: ld.u32
 | 
				
			||||||
 | 
					; CHECK-NEXT: ld.u32
 | 
				
			||||||
 | 
					; CHECK-NEXT: ld.u32
 | 
				
			||||||
 | 
					; CHECK-NEXT: add.s32
 | 
				
			||||||
 | 
					; CHECK-NEXT: add.s32
 | 
				
			||||||
 | 
					; CHECK-NEXT: add.s32
 | 
				
			||||||
 | 
					  %ptr0 = getelementptr i32* %a, i32 0
 | 
				
			||||||
 | 
					  %val0 = load i32* %ptr0
 | 
				
			||||||
 | 
					  %ptr1 = getelementptr i32* %a, i32 1
 | 
				
			||||||
 | 
					  %val1 = load i32* %ptr1
 | 
				
			||||||
 | 
					  %ptr2 = getelementptr i32* %a, i32 2
 | 
				
			||||||
 | 
					  %val2 = load i32* %ptr2
 | 
				
			||||||
 | 
					  %ptr3 = getelementptr i32* %a, i32 3
 | 
				
			||||||
 | 
					  %val3 = load i32* %ptr3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  %t0 = add i32 %val0, %val1
 | 
				
			||||||
 | 
					  %t1 = add i32 %t0, %val2
 | 
				
			||||||
 | 
					  %t2 = add i32 %t1, %val3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  store i32 %t2, i32* %a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ret void
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,32 @@
 | 
				
			||||||
 | 
					; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define void @foo(<2 x i32>* %a) {
 | 
				
			||||||
 | 
					; CHECK: .func foo
 | 
				
			||||||
 | 
					; CHECK: ld.v2.u32
 | 
				
			||||||
 | 
					; CHECK-NEXT: ld.v2.u32
 | 
				
			||||||
 | 
					; CHECK-NEXT: ld.v2.u32
 | 
				
			||||||
 | 
					; CHECK-NEXT: ld.v2.u32
 | 
				
			||||||
 | 
					; CHECK-NEXT: add.s32
 | 
				
			||||||
 | 
					; CHECK-NEXT: add.s32
 | 
				
			||||||
 | 
					; CHECK-NEXT: add.s32
 | 
				
			||||||
 | 
					; CHECK-NEXT: add.s32
 | 
				
			||||||
 | 
					; CHECK-NEXT: add.s32
 | 
				
			||||||
 | 
					; CHECK-NEXT: add.s32
 | 
				
			||||||
 | 
					  %ptr0 = getelementptr <2 x i32>* %a, i32 0
 | 
				
			||||||
 | 
					  %val0 = load <2 x i32>* %ptr0
 | 
				
			||||||
 | 
					  %ptr1 = getelementptr <2 x i32>* %a, i32 1
 | 
				
			||||||
 | 
					  %val1 = load <2 x i32>* %ptr1
 | 
				
			||||||
 | 
					  %ptr2 = getelementptr <2 x i32>* %a, i32 2
 | 
				
			||||||
 | 
					  %val2 = load <2 x i32>* %ptr2
 | 
				
			||||||
 | 
					  %ptr3 = getelementptr <2 x i32>* %a, i32 3
 | 
				
			||||||
 | 
					  %val3 = load <2 x i32>* %ptr3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  %t0 = add <2 x i32> %val0, %val1
 | 
				
			||||||
 | 
					  %t1 = add <2 x i32> %t0, %val2
 | 
				
			||||||
 | 
					  %t2 = add <2 x i32> %t1, %val3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  store <2 x i32> %t2, <2 x i32>* %a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ret void
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,7 +9,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define void @foo(<2 x float>* %a) {
 | 
					define void @foo(<2 x float>* %a) {
 | 
				
			||||||
; CHECK: .func foo
 | 
					; CHECK: .func foo
 | 
				
			||||||
; CHECK: ld.v2.f32 {%f{{[0-9]+}}, %f{{[0-9]+}}}, [%r{{[0-9]+}}];
 | 
					; CHECK: ld.v2.f32 {%f{{[0-9]+}}, %f{{[0-9]+}}}
 | 
				
			||||||
  %t1 = load <2 x float>* %a
 | 
					  %t1 = load <2 x float>* %a
 | 
				
			||||||
  %t2 = fmul <2 x float> %t1, %t1
 | 
					  %t2 = fmul <2 x float> %t1, %t1
 | 
				
			||||||
  store <2 x float> %t2, <2 x float>* %a
 | 
					  store <2 x float> %t2, <2 x float>* %a
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@ define void @foo(<2 x float>* %a) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define void @foo2(<4 x float>* %a) {
 | 
					define void @foo2(<4 x float>* %a) {
 | 
				
			||||||
; CHECK: .func foo2
 | 
					; CHECK: .func foo2
 | 
				
			||||||
; CHECK: ld.v4.f32 {%f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}}, [%r{{[0-9]+}}];
 | 
					; CHECK: ld.v4.f32 {%f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}}
 | 
				
			||||||
  %t1 = load <4 x float>* %a
 | 
					  %t1 = load <4 x float>* %a
 | 
				
			||||||
  %t2 = fmul <4 x float> %t1, %t1
 | 
					  %t2 = fmul <4 x float> %t1, %t1
 | 
				
			||||||
  store <4 x float> %t2, <4 x float>* %a
 | 
					  store <4 x float> %t2, <4 x float>* %a
 | 
				
			||||||
| 
						 | 
					@ -27,8 +27,8 @@ define void @foo2(<4 x float>* %a) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define void @foo3(<8 x float>* %a) {
 | 
					define void @foo3(<8 x float>* %a) {
 | 
				
			||||||
; CHECK: .func foo3
 | 
					; CHECK: .func foo3
 | 
				
			||||||
; CHECK: ld.v4.f32 {%f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}}, [%r{{[0-9]+}}];
 | 
					; CHECK: ld.v4.f32 {%f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}}
 | 
				
			||||||
; CHECK-NEXT: ld.v4.f32 {%f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}}, [%r{{[0-9]+}}+16];
 | 
					; CHECK-NEXT: ld.v4.f32 {%f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}}
 | 
				
			||||||
  %t1 = load <8 x float>* %a
 | 
					  %t1 = load <8 x float>* %a
 | 
				
			||||||
  %t2 = fmul <8 x float> %t1, %t1
 | 
					  %t2 = fmul <8 x float> %t1, %t1
 | 
				
			||||||
  store <8 x float> %t2, <8 x float>* %a
 | 
					  store <8 x float> %t2, <8 x float>* %a
 | 
				
			||||||
| 
						 | 
					@ -39,7 +39,7 @@ define void @foo3(<8 x float>* %a) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define void @foo4(<2 x i32>* %a) {
 | 
					define void @foo4(<2 x i32>* %a) {
 | 
				
			||||||
; CHECK: .func foo4
 | 
					; CHECK: .func foo4
 | 
				
			||||||
; CHECK: ld.v2.u32 {%r{{[0-9]+}}, %r{{[0-9]+}}}, [%r{{[0-9]+}}];
 | 
					; CHECK: ld.v2.u32 {%r{{[0-9]+}}, %r{{[0-9]+}}}
 | 
				
			||||||
  %t1 = load <2 x i32>* %a
 | 
					  %t1 = load <2 x i32>* %a
 | 
				
			||||||
  %t2 = mul <2 x i32> %t1, %t1
 | 
					  %t2 = mul <2 x i32> %t1, %t1
 | 
				
			||||||
  store <2 x i32> %t2, <2 x i32>* %a
 | 
					  store <2 x i32> %t2, <2 x i32>* %a
 | 
				
			||||||
| 
						 | 
					@ -48,7 +48,7 @@ define void @foo4(<2 x i32>* %a) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define void @foo5(<4 x i32>* %a) {
 | 
					define void @foo5(<4 x i32>* %a) {
 | 
				
			||||||
; CHECK: .func foo5
 | 
					; CHECK: .func foo5
 | 
				
			||||||
; CHECK: ld.v4.u32 {%r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}}, [%r{{[0-9]+}}];
 | 
					; CHECK: ld.v4.u32 {%r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}}
 | 
				
			||||||
  %t1 = load <4 x i32>* %a
 | 
					  %t1 = load <4 x i32>* %a
 | 
				
			||||||
  %t2 = mul <4 x i32> %t1, %t1
 | 
					  %t2 = mul <4 x i32> %t1, %t1
 | 
				
			||||||
  store <4 x i32> %t2, <4 x i32>* %a
 | 
					  store <4 x i32> %t2, <4 x i32>* %a
 | 
				
			||||||
| 
						 | 
					@ -57,8 +57,8 @@ define void @foo5(<4 x i32>* %a) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define void @foo6(<8 x i32>* %a) {
 | 
					define void @foo6(<8 x i32>* %a) {
 | 
				
			||||||
; CHECK: .func foo6
 | 
					; CHECK: .func foo6
 | 
				
			||||||
; CHECK: ld.v4.u32 {%r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}}, [%r{{[0-9]+}}];
 | 
					; CHECK: ld.v4.u32 {%r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}}
 | 
				
			||||||
; CHECK-NEXT: ld.v4.u32 {%r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}}, [%r{{[0-9]+}}+16];
 | 
					; CHECK-NEXT: ld.v4.u32 {%r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}}
 | 
				
			||||||
  %t1 = load <8 x i32>* %a
 | 
					  %t1 = load <8 x i32>* %a
 | 
				
			||||||
  %t2 = mul <8 x i32> %t1, %t1
 | 
					  %t2 = mul <8 x i32> %t1, %t1
 | 
				
			||||||
  store <8 x i32> %t2, <8 x i32>* %a
 | 
					  store <8 x i32> %t2, <8 x i32>* %a
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,9 +63,9 @@ define i64 @double_ui64_2(double %x, double %y, double %z) nounwind {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  %1 = fdiv double %x, %y
 | 
					  %1 = fdiv double %x, %y
 | 
				
			||||||
  %2 = fsub double %x, %z
 | 
					  %2 = fsub double %x, %z
 | 
				
			||||||
  %3 = fptoui double %1 to i64
 | 
					  %3 = fptoui double %2 to i64
 | 
				
			||||||
  %4 = fptoui double %2 to i64
 | 
					  %4 = fptoui double %1 to i64
 | 
				
			||||||
  %5 = sub i64 %3, %4
 | 
					  %5 = sub i64 %4, %3
 | 
				
			||||||
  ret i64 %5
 | 
					  ret i64 %5
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -121,9 +121,9 @@ define {double, i64} @double_ui64_4(double %x, double %y) nounwind {
 | 
				
			||||||
; FTOL_2: calll __ftol2
 | 
					; FTOL_2: calll __ftol2
 | 
				
			||||||
;; stack is %x
 | 
					;; stack is %x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  %1 = fptoui double %x to i64
 | 
					  %1 = fptoui double %y to i64
 | 
				
			||||||
  %2 = fptoui double %y to i64
 | 
					  %2 = fptoui double %x to i64
 | 
				
			||||||
  %3 = sub i64 %1, %2
 | 
					  %3 = sub i64 %2, %1
 | 
				
			||||||
  %4 = insertvalue {double, i64} undef, double %x, 0
 | 
					  %4 = insertvalue {double, i64} undef, double %x, 0
 | 
				
			||||||
  %5 = insertvalue {double, i64} %4, i64 %3, 1
 | 
					  %5 = insertvalue {double, i64} %4, i64 %3, 1
 | 
				
			||||||
  ret {double, i64} %5
 | 
					  ret {double, i64} %5
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue