Home | History | Annotate | Download | only in PowerPC
      1 ; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 -verify-machineinstrs | FileCheck %s
      2 ; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr9 -verify-machineinstrs | FileCheck %s
      3 ; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 -verify-machineinstrs | FileCheck %s
      4 ; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 -verify-machineinstrs | FileCheck %s
      5 
      6 ; Verify pre-inc preparation pass doesn't prepare pre-inc for i64 load/store
      7 ; when the stride doesn't conform LDU/STDU DS-form requirement.
      8 
      9 @result = local_unnamed_addr global i64 0, align 8
     10 
     11 define i64 @test_preinc_i64_ld(i8* nocapture readonly, i64) local_unnamed_addr {
     12   %3 = icmp eq i64 %1, 0
     13   br i1 %3, label %4, label %6
     14 
     15 ; <label>:4:                                      ; preds = %2
     16   %5 = load i64, i64* @result, align 8
     17   br label %13
     18 
     19 ; <label>:6:                                      ; preds = %2
     20   %7 = getelementptr inbounds i8, i8* %0, i64 -50000
     21   %8 = getelementptr inbounds i8, i8* %0, i64 -61024
     22   %9 = getelementptr inbounds i8, i8* %0, i64 -62048
     23   %10 = getelementptr inbounds i8, i8* %0, i64 -64096
     24   %11 = load i64, i64* @result, align 8
     25   br label %15
     26 
     27 ; <label>:12:                                     ; preds = %15
     28   store i64 %33, i64* @result, align 8
     29   br label %13
     30 
     31 ; <label>:13:                                     ; preds = %12, %4
     32   %14 = phi i64 [ %5, %4 ], [ %33, %12 ]
     33   ret i64 %14
     34 
     35 ; <label>:15:                                     ; preds = %15, %6
     36   %16 = phi i64 [ %11, %6 ], [ %33, %15 ]
     37   %17 = phi i64 [ 0, %6 ], [ %34, %15 ]
     38   %18 = getelementptr inbounds i8, i8* %7, i64 %17
     39   %19 = bitcast i8* %18 to i64*
     40   %20 = load i64, i64* %19, align 8
     41   %21 = getelementptr inbounds i8, i8* %8, i64 %17
     42   %22 = bitcast i8* %21 to i64*
     43   %23 = load i64, i64* %22, align 8
     44   %24 = getelementptr inbounds i8, i8* %9, i64 %17
     45   %25 = bitcast i8* %24 to i64*
     46   %26 = load i64, i64* %25, align 8
     47   %27 = getelementptr inbounds i8, i8* %10, i64 %17
     48   %28 = bitcast i8* %27 to i64*
     49   %29 = load i64, i64* %28, align 8
     50   %30 = mul i64 %23, %20
     51   %31 = mul i64 %30, %26
     52   %32 = mul i64 %31, %29
     53   %33 = mul i64 %32, %16
     54   %34 = add nuw i64 %17, 1
     55   %35 = icmp eq i64 %34, %1
     56   br i1 %35, label %12, label %15
     57 }
     58 
     59 ; CHECK-LABEL: test_preinc_i64_ld
     60 ; CHECK-NOT: addi {{[0-9]+}}, {{[0-9]+}}, -11023
     61 ; CHECK-NOT: addi {{[0-9]+}}, {{[0-9]+}}, -12047
     62 ; CHECK-NOT: addi {{[0-9]+}}, {{[0-9]+}}, -14095
     63 ; CHECK-DAG: ld {{[0-9]+}}, 14096([[REG1:[0-9]+]])
     64 ; CHECK-DAG: ld {{[0-9]+}},  3072([[REG1]])
     65 ; CHECK-DAG: ld {{[0-9]+}},  2048([[REG1]])
     66 ; CHECK-DAG: ld {{[0-9]+}},  0([[REG1]])
     67 ; CHECK: blr
     68 
     69 define i64 @test_preinc_i64_ldst(i8* nocapture, i64, i64) local_unnamed_addr {
     70   %4 = icmp eq i64 %1, 0
     71   br i1 %4, label %5, label %7
     72 
     73 ; <label>:5:                                      ; preds = %3
     74   %6 = load i64, i64* @result, align 8
     75   br label %16
     76 
     77 ; <label>:7:                                      ; preds = %3
     78   %8 = add i64 %2, 1
     79   %9 = getelementptr inbounds i8, i8* %0, i64 -1024
     80   %10 = add i64 %2, 2
     81   %11 = getelementptr inbounds i8, i8* %0, i64 -2048
     82   %12 = getelementptr inbounds i8, i8* %0, i64 -3072
     83   %13 = getelementptr inbounds i8, i8* %0, i64 -4096
     84   %14 = load i64, i64* @result, align 8
     85   br label %18
     86 
     87 ; <label>:15:                                     ; preds = %18
     88   store i64 %32, i64* @result, align 8
     89   br label %16
     90 
     91 ; <label>:16:                                     ; preds = %15, %5
     92   %17 = phi i64 [ %6, %5 ], [ %32, %15 ]
     93   ret i64 %17
     94 
     95 ; <label>:18:                                     ; preds = %18, %7
     96   %19 = phi i64 [ %14, %7 ], [ %32, %18 ]
     97   %20 = phi i64 [ 0, %7 ], [ %33, %18 ]
     98   %21 = getelementptr inbounds i8, i8* %9, i64 %20
     99   %22 = bitcast i8* %21 to i64*
    100   store i64 %8, i64* %22, align 8
    101   %23 = getelementptr inbounds i8, i8* %11, i64 %20
    102   %24 = bitcast i8* %23 to i64*
    103   store i64 %10, i64* %24, align 8
    104   %25 = getelementptr inbounds i8, i8* %12, i64 %20
    105   %26 = bitcast i8* %25 to i64*
    106   %27 = load i64, i64* %26, align 8
    107   %28 = getelementptr inbounds i8, i8* %13, i64 %20
    108   %29 = bitcast i8* %28 to i64*
    109   %30 = load i64, i64* %29, align 8
    110   %31 = mul i64 %30, %27
    111   %32 = mul i64 %31, %19
    112   %33 = add nuw i64 %20, 1
    113   %34 = icmp eq i64 %33, %1
    114   br i1 %34, label %15, label %18
    115 }
    116 
    117 ; CHECK-LABEL: test_preinc_i64_ldst
    118 ; CHECK-NOT: addi {{[0-9]+}}, {{[0-9]+}}, -3071
    119 ; CHECK-NOT: addi {{[0-9]+}}, {{[0-9]+}}, -2047
    120 ; CHECK-NOT: addi {{[0-9]+}}, {{[0-9]+}}, -1023
    121 ; CHECK-DAG: ld  {{[0-9]+}}, -1024([[REG2:[0-9]+]])
    122 ; CHECK-DAG: ld  {{[0-9]+}}, -2048([[REG2]])
    123 ; CHECK-DAG: std {{[0-9]+}},  1024([[REG2]])
    124 ; CHECK-DAG: std {{[0-9]+}},  0([[REG2]])
    125