Mark the SPU 'lr' instruction to never have side effects.
authorKalle Raiskila <kalle.raiskila@nokia.com>
Mon, 21 Jun 2010 15:08:16 +0000 (15:08 +0000)
committerKalle Raiskila <kalle.raiskila@nokia.com>
Mon, 21 Jun 2010 15:08:16 +0000 (15:08 +0000)
This allows the fast regiser allocator to remove redundant
register moves.
Update a set of tests that depend on the register allocator
to be linear scan.

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

lib/Target/CellSPU/SPUInstrInfo.cpp
test/CodeGen/CellSPU/call.ll
test/CodeGen/CellSPU/call_indirect.ll
test/CodeGen/CellSPU/jumptable.ll
test/CodeGen/CellSPU/loads.ll

index 877d1c5dca3ba903d6ca48541c5ee37c9b0fde92..9dfe01476c825af85881a7d79447d256b4d5442e 100644 (file)
@@ -164,11 +164,9 @@ SPUInstrInfo::isMoveInstr(const MachineInstr& MI,
            MI.getOperand(0).isReg() &&
            MI.getOperand(1).isReg() &&
            "invalid SPU OR<type>_<vec> or LR instruction!");
-    if (MI.getOperand(0).getReg() == MI.getOperand(1).getReg()) {
       sourceReg = MI.getOperand(1).getReg();
       destReg = MI.getOperand(0).getReg();
       return true;
-    }
     break;
   }
   case SPU::ORv16i8:
index 960d2feadeda4c9676deed76f431b3a481b09434..eb7cf2c6467c82345a688ba47d1c092c0cbe966d 100644 (file)
@@ -1,7 +1,8 @@
-; RUN: llc < %s -march=cellspu > %t1.s
+; RUN: llc < %s -march=cellspu -regalloc=linearscan > %t1.s
 ; RUN: grep brsl    %t1.s | count 1
 ; RUN: grep brasl   %t1.s | count 1
 ; RUN: grep stqd    %t1.s | count 80
+; RUN: llc < %s -march=cellspu | FileCheck %s
 
 target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128"
 target triple = "spu"
@@ -16,6 +17,8 @@ entry:
 declare void @extern_stub_1(i32, i32)
 
 define i32 @stub_1(i32 %x, float %y) {
+ ; CHECK: il $3, 0
+ ; CHECK: bi $lr 
 entry:
   ret i32 0
 }
index 08dad74843e46f27f3bac9f5e300983c1c51844a..d94d77c9f14231df52341c42052d0cbafd63c537 100644 (file)
@@ -1,5 +1,5 @@
-; RUN: llc < %s -march=cellspu -asm-verbose=0 > %t1.s
-; RUN: llc < %s -march=cellspu -mattr=large_mem -asm-verbose=0 > %t2.s
+; RUN: llc < %s -march=cellspu -asm-verbose=0 -regalloc=linearscan > %t1.s
+; RUN: llc < %s -march=cellspu -mattr=large_mem -asm-verbose=0 -regalloc=linearscan > %t2.s
 ; RUN: grep bisl    %t1.s | count 7
 ; RUN: grep ila     %t1.s | count 1
 ; RUN: grep rotqby  %t1.s | count 5
index d7d1ef49f97fbe519552ba326ba8d871698d3ba3..42b41b3bf29b70b3114c09502a5f4bb45478dfeb 100644 (file)
@@ -2,9 +2,9 @@
 ; This is to check that emitting jumptables doesn't crash llc
 define i32 @test(i32 %param) {
 entry:
-;CHECK:        ai      $4, $3, -1
-;CHECK:        clgti   $5, $4, 3
-;CHECK:        brnz    $5,.LBB0_2
+;CHECK:        ai      {{\$.}}, $3, -1
+;CHECK:        clgti   {{\$., \$.}}, 3
+;CHECK:        brnz    {{\$.}},.LBB0_2
   switch i32 %param, label %bb1 [
     i32 1, label %bb3
     i32 2, label %bb2
index c46bcd18c15af5473f023130a71f0cf61c22cde2..4284c22837d38bf89e7374e8feaaf0a5aad20e2c 100644 (file)
@@ -22,13 +22,15 @@ entry:
 
 declare <4 x i32>* @getv4f32ptr()
 define <4 x i32> @func() {
-        ;CHECK: brasl
-        ;CHECK: lr     {{\$[0-9]*, \$3}}
-        ;CHECK: brasl
-        %rv1 = call <4 x i32>* @getv4f32ptr()
-        %rv2 = call <4 x i32>* @getv4f32ptr()
-        %rv3 = load <4 x i32>* %rv1
-        ret <4 x i32> %rv3
+       ;CHECK: brasl
+       ; we need to have some instruction to move the result to safety.
+       ; which instruction (lr, stqd...) depends on the regalloc
+       ;CHECK: {{.*}}
+       ;CHECK: brasl
+       %rv1 = call <4 x i32>* @getv4f32ptr()
+       %rv2 = call <4 x i32>* @getv4f32ptr()
+       %rv3 = load <4 x i32>* %rv1
+       ret <4 x i32> %rv3
 }
 
 define <4 x float> @load_undef(){