Home | History | Annotate | Download | only in PowerPC
      1 ; Test that accesses of the stack remain within the range defined by R1,
      2 ; i.e. that loads and stores only access the allocated stack. This does not
      3 ; have to be the case when red zone is present.
      4 
      5 ; Make sure that there is no red zone, i.e. ppc32 and SVR4 ABI.
      6 ; RUN: llc -mtriple=powerpc--freebsd-elf < %s | FileCheck %s
      7 
      8 ; There are two ways that the stack pointer can be adjusted in the prologue:
      9 ; - by adding an immediate value:
     10 ;     stwu r1, -imm(r1)
     11 ; - by adding another register:
     12 ;     stwux r1, rx, r1
     13 ;
     14 ; The restoring of the stack pointer can be done:
     15 ; - by adding an immediate value to it:
     16 ;     addi r1, r1, imm
     17 ; - by copying the value from another register:
     18 ;     mr r1, rx
     19 
     20 
     21 ; Nothing (no special features).
     22 ;
     23 ; CHECK-LABEL: test_n:
     24 ; CHECK-NOT: stw {{[0-9]+}}, -{{[0-9]+}}(1)
     25 ; CHECK: stwu 1, -[[SIZE:[0-9]+]](1)
     26 ; CHECK: addi 1, 1, [[SIZE]]
     27 ; CHECK-NOT: lwz {{[0-9]+}}, -{{[0-9]+}}(1)
     28 define i32 @test_n() local_unnamed_addr #0 {
     29 entry:
     30   %t0 = tail call i32 bitcast (i32 (...)* @bar0 to i32 ()*)() #0
     31   ret i32 %t0
     32 }
     33 
     34 ; Aligned object on the stack.
     35 ;
     36 ; CHECK-LABEL: test_a:
     37 ; CHECK-NOT: stw {{[0-9]+}}, -{{[0-9]+}}(1)
     38 ; CHECK: stwux 1, 1, {{[0-9]+}}
     39 ; CHECK: mr 1, {{[0-9]+}}
     40 ; CHECK-NOT: lwz {{[0-9]+}}, -{{[0-9]+}}(1)
     41 
     42 define i32 @test_a() local_unnamed_addr #0 {
     43 entry:
     44   %t0 = alloca i32, align 128
     45   %t1 = tail call i32 bitcast (i32 (...)* @bar1 to i32 (i32*)*)(i32* %t0) #0
     46   ret i32 %t1
     47 }
     48 
     49 ; Dynamic allocation on the stack.
     50 ;
     51 ; CHECK-LABEL: test_d:
     52 ; CHECK-NOT: stw {{[0-9]+}}, -{{[0-9]+}}(1)
     53 ; CHECK: stwu 1, -[[SIZE:[0-9]+]](1)
     54 ; CHECK: mr 1, {{[0-9]+}}
     55 ; CHECK-NOT: lwz {{[0-9]+}}, -{{[0-9]+}}(1)
     56 define i32 @test_d(i32 %p0) local_unnamed_addr #0 {
     57   %t0 = alloca i32, i32 %p0, align 4
     58   %t1 = tail call i32 bitcast (i32 (...)* @bar1 to i32 (i32*)*)(i32* %t0) #0
     59   ret i32 %t1
     60 }
     61 
     62 ; Large stack (exceeds size of D-field).
     63 ; CHECK-LABEL: test_s:
     64 ; CHECK-NOT: stw {{[0-9]+}}, -{{[0-9]+}}(1)
     65 ; CHECK: stwux 1, 1, {{[0-9]+}}
     66 ; CHECK: mr 1, {{[0-9]+}}
     67 ; CHECK-NOT: lwz {{[0-9]+}}, -{{[0-9]+}}(1)
     68 define i32 @test_s(i32 %p0) local_unnamed_addr #0 {
     69 entry:
     70   %t0 = alloca [16384 x i32]
     71   %t1 = getelementptr [16384 x i32], [16384 x i32]* %t0, i32 0, i32 0
     72   %t2 = tail call i32 bitcast (i32 (...)* @bar1 to i32 (i32*)*)(i32* %t1) #0
     73   ret i32 %t2
     74 }
     75 
     76 ; Combinations.
     77 
     78 ; CHECK-LABEL: test_ad:
     79 ; CHECK-NOT: stw {{[0-9]+}}, -{{[0-9]+}}(1)
     80 ; CHECK: stwux 1, 1, {{[0-9]+}}
     81 ; CHECK: mr 1, {{[0-9]+}}
     82 ; CHECK-NOT: lwz {{[0-9]+}}, -{{[0-9]+}}(1)
     83 define i32 @test_ad(i32 %p0) local_unnamed_addr #0 {
     84   %t0 = alloca i32, align 128
     85   %t1 = alloca i32, i32 %p0, align 4
     86   %t2 = tail call i32 bitcast (i32 (...)* @bar1 to i32 (i32*)*)(i32* %t0) #0
     87   %t3 = tail call i32 bitcast (i32 (...)* @bar1 to i32 (i32*)*)(i32* %t1) #0
     88   %t4 = add i32 %t2, %t3
     89   ret i32 %t4
     90 }
     91 
     92 ; CHECK-LABEL: test_as:
     93 ; CHECK-NOT: stw {{[0-9]+}}, -{{[0-9]+}}(1)
     94 ; CHECK: stwux 1, 1, {{[0-9]+}}
     95 ; CHECK: mr 1, {{[0-9]+}}
     96 ; CHECK-NOT: lwz {{[0-9]+}}, -{{[0-9]+}}(1)
     97 define i32 @test_as() local_unnamed_addr #0 {
     98   %t0 = alloca i32, align 128
     99   %t1 = alloca [16384 x i32]
    100   %t2 = tail call i32 bitcast (i32 (...)* @bar1 to i32 (i32*)*)(i32* %t0) #0
    101   %t3 = getelementptr [16384 x i32], [16384 x i32]* %t1, i32 0, i32 0
    102   %t4 = tail call i32 bitcast (i32 (...)* @bar1 to i32 (i32*)*)(i32* %t3) #0
    103   %t5 = add i32 %t2, %t4
    104   ret i32 %t5
    105 }
    106 
    107 ; CHECK-LABEL: test_ds:
    108 ; CHECK-NOT: stw {{[0-9]+}}, -{{[0-9]+}}(1)
    109 ; CHECK: stwux 1, 1, {{[0-9]+}}
    110 ; CHECK: mr 1, {{[0-9]+}}
    111 ; CHECK-NOT: lwz {{[0-9]+}}, -{{[0-9]+}}(1)
    112 define i32 @test_ds(i32 %p0) local_unnamed_addr #0 {
    113   %t0 = alloca i32, i32 %p0, align 4
    114   %t1 = alloca [16384 x i32]
    115   %t2 = tail call i32 bitcast (i32 (...)* @bar1 to i32 (i32*)*)(i32* %t0) #0
    116   %t3 = getelementptr [16384 x i32], [16384 x i32]* %t1, i32 0, i32 0
    117   %t4 = tail call i32 bitcast (i32 (...)* @bar1 to i32 (i32*)*)(i32* %t3) #0
    118   %t5 = add i32 %t2, %t4
    119   ret i32 %t5
    120 }
    121 
    122 ; CHECK-LABEL: test_ads:
    123 ; CHECK-NOT: stw {{[0-9]+}}, -{{[0-9]+}}(1)
    124 ; CHECK: stwux 1, 1, {{[0-9]+}}
    125 ; CHECK: mr 1, {{[0-9]+}}
    126 ; CHECK-NOT: lwz {{[0-9]+}}, -{{[0-9]+}}(1)
    127 define i32 @test_ads(i32 %p0) local_unnamed_addr #0 {
    128   %t0 = alloca i32, align 128
    129   %t1 = alloca i32, i32 %p0, align 4
    130   %t2 = alloca [16384 x i32]
    131 
    132   %t3 = tail call i32 bitcast (i32 (...)* @bar1 to i32 (i32*)*)(i32* %t0) #0
    133   %t4 = tail call i32 bitcast (i32 (...)* @bar1 to i32 (i32*)*)(i32* %t1) #0
    134   %t5 = add i32 %t3, %t4
    135 
    136   %t6 = getelementptr [16384 x i32], [16384 x i32]* %t2, i32 0, i32 0
    137   %t7 = tail call i32 bitcast (i32 (...)* @bar1 to i32 (i32*)*)(i32* %t6) #0
    138   %t8 = add i32 %t5, %t7
    139   ret i32 %t7
    140 }
    141 
    142 
    143 declare i32 @bar0(...) local_unnamed_addr #0
    144 declare i32 @bar1(...) local_unnamed_addr #0
    145 
    146 attributes #0 = { nounwind }
    147