reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 -verify-machineinstrs | FileCheck %s
; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr9 -verify-machineinstrs | FileCheck %s
; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 -verify-machineinstrs | FileCheck %s
; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 -verify-machineinstrs | FileCheck %s

; Verify pre-inc preparation pass doesn't prepare pre-inc for i64 load/store
; when the stride doesn't conform LDU/STDU DS-form requirement.

@result = local_unnamed_addr global i64 0, align 8

define i64 @test_preinc_i64_ld(i8* nocapture readonly, i64) local_unnamed_addr {
  %3 = icmp eq i64 %1, 0
  br i1 %3, label %4, label %6

; <label>:4:                                      ; preds = %2
  %5 = load i64, i64* @result, align 8
  br label %13

; <label>:6:                                      ; preds = %2
  %7 = getelementptr inbounds i8, i8* %0, i64 -50000
  %8 = getelementptr inbounds i8, i8* %0, i64 -61024
  %9 = getelementptr inbounds i8, i8* %0, i64 -62048
  %10 = getelementptr inbounds i8, i8* %0, i64 -64096
  %11 = load i64, i64* @result, align 8
  br label %15

; <label>:12:                                     ; preds = %15
  store i64 %33, i64* @result, align 8
  br label %13

; <label>:13:                                     ; preds = %12, %4
  %14 = phi i64 [ %5, %4 ], [ %33, %12 ]
  ret i64 %14

; <label>:15:                                     ; preds = %15, %6
  %16 = phi i64 [ %11, %6 ], [ %33, %15 ]
  %17 = phi i64 [ 0, %6 ], [ %34, %15 ]
  %18 = getelementptr inbounds i8, i8* %7, i64 %17
  %19 = bitcast i8* %18 to i64*
  %20 = load i64, i64* %19, align 8
  %21 = getelementptr inbounds i8, i8* %8, i64 %17
  %22 = bitcast i8* %21 to i64*
  %23 = load i64, i64* %22, align 8
  %24 = getelementptr inbounds i8, i8* %9, i64 %17
  %25 = bitcast i8* %24 to i64*
  %26 = load i64, i64* %25, align 8
  %27 = getelementptr inbounds i8, i8* %10, i64 %17
  %28 = bitcast i8* %27 to i64*
  %29 = load i64, i64* %28, align 8
  %30 = mul i64 %23, %20
  %31 = mul i64 %30, %26
  %32 = mul i64 %31, %29
  %33 = mul i64 %32, %16
  %34 = add nuw i64 %17, 1
  %35 = icmp eq i64 %34, %1
  br i1 %35, label %12, label %15
}

; CHECK-LABEL: test_preinc_i64_ld
; CHECK-NOT: addi {{[0-9]+}}, {{[0-9]+}}, -11023
; CHECK-NOT: addi {{[0-9]+}}, {{[0-9]+}}, -12047
; CHECK-NOT: addi {{[0-9]+}}, {{[0-9]+}}, -14095
; CHECK-DAG: ld {{[0-9]+}}, 14096([[REG1:[0-9]+]])
; CHECK-DAG: ld {{[0-9]+}},  3072([[REG1]])
; CHECK-DAG: ld {{[0-9]+}},  2048([[REG1]])
; CHECK-DAG: ld {{[0-9]+}},  0([[REG1]])
; CHECK: blr

define i64 @test_preinc_i64_ldst(i8* nocapture, i64, i64) local_unnamed_addr {
  %4 = icmp eq i64 %1, 0
  br i1 %4, label %5, label %7

; <label>:5:                                      ; preds = %3
  %6 = load i64, i64* @result, align 8
  br label %16

; <label>:7:                                      ; preds = %3
  %8 = add i64 %2, 1
  %9 = getelementptr inbounds i8, i8* %0, i64 -1024
  %10 = add i64 %2, 2
  %11 = getelementptr inbounds i8, i8* %0, i64 -2048
  %12 = getelementptr inbounds i8, i8* %0, i64 -3072
  %13 = getelementptr inbounds i8, i8* %0, i64 -4096
  %14 = load i64, i64* @result, align 8
  br label %18

; <label>:15:                                     ; preds = %18
  store i64 %32, i64* @result, align 8
  br label %16

; <label>:16:                                     ; preds = %15, %5
  %17 = phi i64 [ %6, %5 ], [ %32, %15 ]
  ret i64 %17

; <label>:18:                                     ; preds = %18, %7
  %19 = phi i64 [ %14, %7 ], [ %32, %18 ]
  %20 = phi i64 [ 0, %7 ], [ %33, %18 ]
  %21 = getelementptr inbounds i8, i8* %9, i64 %20
  %22 = bitcast i8* %21 to i64*
  store i64 %8, i64* %22, align 8
  %23 = getelementptr inbounds i8, i8* %11, i64 %20
  %24 = bitcast i8* %23 to i64*
  store i64 %10, i64* %24, align 8
  %25 = getelementptr inbounds i8, i8* %12, i64 %20
  %26 = bitcast i8* %25 to i64*
  %27 = load i64, i64* %26, align 8
  %28 = getelementptr inbounds i8, i8* %13, i64 %20
  %29 = bitcast i8* %28 to i64*
  %30 = load i64, i64* %29, align 8
  %31 = mul i64 %30, %27
  %32 = mul i64 %31, %19
  %33 = add nuw i64 %20, 1
  %34 = icmp eq i64 %33, %1
  br i1 %34, label %15, label %18
}

; CHECK-LABEL: test_preinc_i64_ldst
; CHECK-NOT: addi {{[0-9]+}}, {{[0-9]+}}, -3071
; CHECK-NOT: addi {{[0-9]+}}, {{[0-9]+}}, -2047
; CHECK-NOT: addi {{[0-9]+}}, {{[0-9]+}}, -1023
; CHECK-DAG: ld  {{[0-9]+}}, -1024([[REG2:[0-9]+]])
; CHECK-DAG: ld  {{[0-9]+}}, -2048([[REG2]])
; CHECK-DAG: std {{[0-9]+}},  1024([[REG2]])
; CHECK-DAG: std {{[0-9]+}},  0([[REG2]])