Fix non-deterministic SDNodeOrder-dependent codegen
authorNico Rieck <nico.rieck@gmail.com>
Sun, 12 Jan 2014 14:09:17 +0000 (14:09 +0000)
committerNico Rieck <nico.rieck@gmail.com>
Sun, 12 Jan 2014 14:09:17 +0000 (14:09 +0000)
Reset SelectionDAGBuilder's SDNodeOrder to ensure deterministic code
generation.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199050 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
test/CodeGen/AArch64/variadic.ll
test/CodeGen/NVPTX/vec-param-load.ll
test/CodeGen/X86/MachineSink-DbgValue.ll
test/CodeGen/X86/bt.ll
test/CodeGen/X86/i64-mem-copy.ll
test/CodeGen/X86/pr16031.ll
test/CodeGen/X86/sse2.ll
test/CodeGen/X86/v2f32.ll

index e40a7c44adee961bc04586bd486daaa8ced0585c..6c8e2f83a4f95f9e7c62bf12d075b5ee4e76ce31 100644 (file)
@@ -892,6 +892,7 @@ void SelectionDAGBuilder::clear() {
   PendingExports.clear();
   CurInst = NULL;
   HasTailCall = false;
+  SDNodeOrder = LowestSDNodeOrder;
 }
 
 /// clearDanglingDebugInfo - Clear the dangling debug information
index d67c84664eb125cc920266db25d50d45e107bed9..d32d13f343d40c643fab2621a362f59674e18f5a 100644 (file)
@@ -488,6 +488,10 @@ private:
 private:
   const TargetMachine &TM;
 public:
+  /// Lowest valid SDNodeOrder. The special case 0 is reserved for scheduling
+  /// nodes without a corresponding SDNode.
+  static const unsigned LowestSDNodeOrder = 1;
+
   SelectionDAG &DAG;
   const DataLayout *TD;
   AliasAnalysis *AA;
@@ -534,7 +538,7 @@ public:
 
   SelectionDAGBuilder(SelectionDAG &dag, FunctionLoweringInfo &funcinfo,
                       CodeGenOpt::Level ol)
-    : CurInst(NULL), SDNodeOrder(0), TM(dag.getTarget()),
+    : CurInst(NULL), SDNodeOrder(LowestSDNodeOrder), TM(dag.getTarget()),
       DAG(dag), FuncInfo(funcinfo), OptLevel(ol),
       HasTailCall(false) {
   }
index f3d376beeb282663e95814db603b16c3c26d821f..1ceaf5ff516b31b0aa6f70c6bb44e4e1a42735a6 100644 (file)
@@ -10,14 +10,12 @@ declare void @llvm.va_start(i8*)
 define void @test_simple(i32 %n, ...) {
 ; CHECK-LABEL: test_simple:
 ; CHECK: sub sp, sp, #[[STACKSIZE:[0-9]+]]
-; CHECK: add x[[VA_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:var
 ; CHECK: mov x[[FPRBASE:[0-9]+]], sp
 ; CHECK: str q7, [x[[FPRBASE]], #112]
 ; CHECK: add x[[GPRBASE:[0-9]+]], sp, #[[GPRFROMSP:[0-9]+]]
 ; CHECK: str x7, [x[[GPRBASE]], #48]
 
 ; CHECK-NOFP: sub sp, sp, #[[STACKSIZE:[0-9]+]]
-; CHECK-NOFP: add x[[VA_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:var
 ; CHECK-NOFP: add x[[GPRBASE:[0-9]+]], sp, #[[GPRFROMSP:[0-9]+]]
 ; CHECK-NOFP: str x7, [x[[GPRBASE]], #48]
 ; CHECK-NOFP-NOT: str q7,
@@ -27,8 +25,10 @@ define void @test_simple(i32 %n, ...) {
 
 ; CHECK: str q0, [sp]
 ; CHECK: str x1, [sp, #[[GPRFROMSP]]]
+; CHECK: add x[[VA_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:var
 
 ; CHECK-NOFP-NOT: str q0, [sp]
+; CHECK-NOFP: add x[[VA_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:var
 
   %addr = bitcast %va_list* @var to i8*
   call void @llvm.va_start(i8* %addr)
index a384348a659018dff59315b747c40e94ced200c5..4193ac4085cc1bb9d3d9f5dcd88a35d40a32ecfa 100644 (file)
@@ -5,9 +5,9 @@ target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
 
 define <16 x float> @foo(<16 x float> %a) {
 ; Make sure we index into vectors properly
-; CHECK: ld.param.v4.f32         {%f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}}, [foo_param_0];
-; CHECK: ld.param.v4.f32         {%f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}}, [foo_param_0+16];
-; CHECK: ld.param.v4.f32         {%f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}}, [foo_param_0+32];
 ; CHECK: ld.param.v4.f32         {%f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}}, [foo_param_0+48];
+; CHECK: ld.param.v4.f32         {%f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}}, [foo_param_0+32];
+; CHECK: ld.param.v4.f32         {%f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}}, [foo_param_0+16];
+; CHECK: ld.param.v4.f32         {%f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}}, [foo_param_0];
   ret <16 x float> %a
 }
index 584e644ed51fa853828e489f85bbb1de1e012c45..4ce2fb3dcafbda3506c6e4134aa915c277c15b44 100644 (file)
@@ -13,8 +13,8 @@ define i32 @foo(i32 %i, i32* nocapture %c) nounwind uwtable readonly ssp {
 
 bb1:                                     ; preds = %0
 ;CHECK: DEBUG_VALUE: a
-;CHECK-NEXT:   .loc    1 5 5
-;CHECK-NEXT:   addl
+;CHECK:      .loc      1 5 5
+;CHECK-NEXT: addl
   %gh = add nsw i32 %ab, 2, !dbg !16
   br label %bb2, !dbg !16
 
index f12a3543b072aac9a070438b914293dc0e5221d8..036ec0acc6e8b2878acef586d2b2ff973cb1f6c5 100644 (file)
@@ -20,7 +20,7 @@
 define void @test2(i32 %x, i32 %n) nounwind {
 entry:
 ; CHECK: test2
-; CHECK: btl %eax, %ecx
+; CHECK: btl %ecx, %eax
 ; CHECK: jb
        %tmp29 = lshr i32 %x, %n                ; <i32> [#uses=1]
        %tmp3 = and i32 %tmp29, 1               ; <i32> [#uses=1]
index dce12ae124857865ff04150449fb6723bce6a793..edab4e6d3f00d1714d9839e747282c1f537c824f 100644 (file)
@@ -3,7 +3,7 @@
 ; X64: movq ({{%rsi|%rdx}}), %r
 
 ; RUN: llc < %s -march=x86 -mattr=+sse2 | FileCheck %s -check-prefix=X32
-; X32: movsd (%eax), %xmm
+; X32: movsd (%ecx), %xmm
 
 ; Uses movsd to load / store i64 values if sse2 is available.
 
index ecf6218aeb386f87c4d6b9e35924e0f5e5700b0a..dc16fd9671adfa2fc9e7b4d9327df498d689637c 100644 (file)
@@ -2,9 +2,9 @@
 
 ; CHECK-LABEL: main:
 ; CHECK: pushl %esi
+; CHECK-NEXT: testb $1, 8(%esp)
 ; CHECK-NEXT: movl  $-12, %eax
 ; CHECK-NEXT: movl  $-1, %edx
-; CHECK-NEXT: testb $1, 8(%esp)
 ; CHECK-NEXT: cmovel    %edx, %eax
 ; CHECK-NEXT: xorl  %ecx, %ecx
 ; CHECK-NEXT: movl  %eax, %esi
index 9147c22dd3753cd9558fd86242dc6953f9e82278..628dba0b10197ac51e1556283b12bdbd204c63e6 100644 (file)
@@ -9,10 +9,10 @@ define void @test1(<2 x double>* %r, <2 x double>* %A, double %B) nounwind  {
        ret void
 
 ; CHECK-LABEL: test1:
-; CHECK:       movl    8(%esp), %eax
-; CHECK-NEXT:  movapd  (%eax), %xmm0
+; CHECK:       movl    4(%esp), %eax
+; CHECK-NEXT:  movl    8(%esp), %ecx
+; CHECK-NEXT:  movapd  (%ecx), %xmm0
 ; CHECK-NEXT:  movlpd  12(%esp), %xmm0
-; CHECK-NEXT:  movl    4(%esp), %eax
 ; CHECK-NEXT:  movapd  %xmm0, (%eax)
 ; CHECK-NEXT:  ret
 }
index f2bebf57d4dca5cbc0390d132900648e6c6b1841..dab5e7bc944c7f0332837fbd8ef406bca3b6ec44 100644 (file)
@@ -24,9 +24,9 @@ define void @test1(<2 x float> %Q, float *%P2) nounwind {
 ; W64-NEXT: ret
 
 ; X32-LABEL: test1:
+; X32-NEXT: movl       4(%esp), %eax
 ; X32-NEXT: pshufd     $1, %xmm0, %xmm1
 ; X32-NEXT: addss      %xmm0, %xmm1
-; X32-NEXT: movl       4(%esp), %eax
 ; X32-NEXT: movss      %xmm1, (%eax)
 ; X32-NEXT: ret
 }