brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.3 KiB · 3c42987 Raw
210 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mcpu cortex-a53 -mtriple=aarch64 | FileCheck %s --check-prefix=A533 4; PR26827 - Merge stores causes wrong dependency.5%struct1 = type { ptr, ptr, i32, i32, i16, i16, ptr, ptr }6@gv0 = internal unnamed_addr global i32 0, align 47@gv1 = internal unnamed_addr global ptr null, align 88 9define void @test(ptr %fde, i32 %fd, ptr %func, ptr %arg) uwtable {10;CHECK-LABEL: test11; A53-LABEL: test:12; A53:       // %bb.0: // %entry13; A53-NEXT:    stp x30, x19, [sp, #-16]! // 16-byte Folded Spill14; A53-NEXT:    .cfi_def_cfa_offset 1615; A53-NEXT:    .cfi_offset w19, -816; A53-NEXT:    .cfi_offset w30, -1617; A53-NEXT:    .cfi_remember_state18; A53-NEXT:    movi v0.2d, #000000000000000019; A53-NEXT:    mov x8, x020; A53-NEXT:    mov x19, x821; A53-NEXT:    mov w0, w122; A53-NEXT:    mov w9, #25623; A53-NEXT:    stp x2, x3, [x8, #32]24; A53-NEXT:    mov x2, x825; A53-NEXT:    str q0, [x19, #16]!26; A53-NEXT:    str w1, [x19]27; A53-NEXT:    mov w1, #428; A53-NEXT:    str q0, [x8]29; A53-NEXT:    strh w9, [x8, #24]30; A53-NEXT:    str wzr, [x8, #20]31; A53-NEXT:    bl fcntl32; A53-NEXT:    adrp x9, gv033; A53-NEXT:    add x9, x9, :lo12:gv034; A53-NEXT:    cmp x19, x935; A53-NEXT:    b.eq .LBB0_436; A53-NEXT:  // %bb.1:37; A53-NEXT:    ldr w8, [x19]38; A53-NEXT:    ldr w9, [x9]39; A53-NEXT:    .p2align 4, , 840; A53-NEXT:  .LBB0_2: // %while.body.i.split.ver.us41; A53-NEXT:    // =>This Inner Loop Header: Depth=142; A53-NEXT:    lsl w9, w9, #143; A53-NEXT:    cmp w9, w844; A53-NEXT:    b.le .LBB0_245; A53-NEXT:  // %bb.3: // %while.end.i46; A53-NEXT:    bl foo47; A53-NEXT:    adrp x8, gv148; A53-NEXT:    str x0, [x8, :lo12:gv1]49; A53-NEXT:    ldp x30, x19, [sp], #16 // 16-byte Folded Reload50; A53-NEXT:    .cfi_def_cfa_offset 051; A53-NEXT:    .cfi_restore w1952; A53-NEXT:    .cfi_restore w3053; A53-NEXT:    ret54; A53-NEXT:    .p2align 4, , 855; A53-NEXT:  .LBB0_4: // %while.body.i.split56; A53-NEXT:    // =>This Inner Loop Header: Depth=157; A53-NEXT:    .cfi_restore_state58; A53-NEXT:    b .LBB0_459entry:60  tail call void @llvm.memset.p0.i64(ptr align 8 %fde, i8 0, i64 40, i1 false)61  %state = getelementptr inbounds %struct1, ptr %fde, i64 0, i32 462  store i16 256, ptr %state, align 863  %fd1 = getelementptr inbounds %struct1, ptr %fde, i64 0, i32 264  store i32 %fd, ptr %fd1, align 865  %force_eof = getelementptr inbounds %struct1, ptr %fde, i64 0, i32 366  store i32 0, ptr %force_eof, align 467  %func2 = getelementptr inbounds %struct1, ptr %fde, i64 0, i32 668  store ptr %func, ptr %func2, align 869  %arg3 = getelementptr inbounds %struct1, ptr %fde, i64 0, i32 770  store ptr %arg, ptr %arg3, align 871  %call = tail call i32 (i32, i32, ...) @fcntl(i32 %fd, i32 4, ptr %fde) #672  %0 = load i32, ptr %fd1, align 873  %cmp.i = icmp slt i32 %0, 074  br i1 %cmp.i, label %if.then.i, label %while.body.i.preheader75if.then.i:76  unreachable77 78while.body.i.preheader:79  %1 = load i32, ptr @gv0, align 480  %2 = icmp eq ptr %fd1, @gv081  br i1 %2, label %while.body.i.split, label %while.body.i.split.ver.us.preheader82 83while.body.i.split.ver.us.preheader:84  br label %while.body.i.split.ver.us85 86while.body.i.split.ver.us:87  %.reg2mem21.0 = phi i32 [ %mul.i.ver.us, %while.body.i.split.ver.us ], [ %1, %while.body.i.split.ver.us.preheader ]88  %mul.i.ver.us = shl nsw i32 %.reg2mem21.0, 189  %3 = icmp sgt i32 %mul.i.ver.us, %090  br i1 %3, label %while.end.i, label %while.body.i.split.ver.us91 92while.body.i.split:93  br label %while.body.i.split94 95while.end.i:96  %call.i = tail call ptr @foo()97  store ptr %call.i, ptr @gv1, align 898  br label %exit99 100exit:101  ret void102}103 104; TODO: rev16?105 106define void @rotate16_in_place(ptr %p) {107; A53-LABEL: rotate16_in_place:108; A53:       // %bb.0:109; A53-NEXT:    ldrb w8, [x0, #1]110; A53-NEXT:    ldrb w9, [x0]111; A53-NEXT:    strb w8, [x0]112; A53-NEXT:    strb w9, [x0, #1]113; A53-NEXT:    ret114  %p1 = getelementptr i8, ptr %p, i64 1115  %i0 = load i8, ptr %p, align 1116  %i1 = load i8, ptr %p1, align 1117  store i8 %i1, ptr %p, align 1118  store i8 %i0, ptr %p1, align 1119  ret void120}121 122; TODO: rev16?123 124define void @rotate16(ptr %p, ptr %q) {125; A53-LABEL: rotate16:126; A53:       // %bb.0:127; A53-NEXT:    ldrb w8, [x0, #1]128; A53-NEXT:    ldrb w9, [x0]129; A53-NEXT:    strb w8, [x1]130; A53-NEXT:    strb w9, [x1, #1]131; A53-NEXT:    ret132  %p1 = getelementptr i8, ptr %p, i64 1133  %q1 = getelementptr i8, ptr %q, i64 1134  %i0 = load i8, ptr %p, align 1135  %i1 = load i8, ptr %p1, align 1136  store i8 %i1, ptr %q, align 1137  store i8 %i0, ptr %q1, align 1138  ret void139}140 141define void @rotate32_in_place(ptr %p) {142; A53-LABEL: rotate32_in_place:143; A53:       // %bb.0:144; A53-NEXT:    ldr w8, [x0]145; A53-NEXT:    ror w8, w8, #16146; A53-NEXT:    str w8, [x0]147; A53-NEXT:    ret148  %p1 = getelementptr i16, ptr %p, i64 1149  %i0 = load i16, ptr %p, align 2150  %i1 = load i16, ptr %p1, align 2151  store i16 %i1, ptr %p, align 2152  store i16 %i0, ptr %p1, align 2153  ret void154}155 156define void @rotate32(ptr %p) {157; A53-LABEL: rotate32:158; A53:       // %bb.0:159; A53-NEXT:    ldr w8, [x0]160; A53-NEXT:    ror w8, w8, #16161; A53-NEXT:    str w8, [x0, #84]162; A53-NEXT:    ret163  %p1 = getelementptr i16, ptr %p, i64 1164  %p42 = getelementptr i16, ptr %p, i64 42165  %p43 = getelementptr i16, ptr %p, i64 43166  %i0 = load i16, ptr %p, align 2167  %i1 = load i16, ptr %p1, align 2168  store i16 %i1, ptr %p42, align 2169  store i16 %i0, ptr %p43, align 2170  ret void171}172 173; Prefer paired memops over rotate.174 175define void @rotate64_in_place(ptr %p) {176; A53-LABEL: rotate64_in_place:177; A53:       // %bb.0:178; A53-NEXT:    ldp w9, w8, [x0]179; A53-NEXT:    stp w8, w9, [x0]180; A53-NEXT:    ret181  %p1 = getelementptr i32, ptr %p, i64 1182  %i0 = load i32, ptr %p, align 4183  %i1 = load i32, ptr %p1, align 4184  store i32 %i1, ptr %p, align 4185  store i32 %i0, ptr %p1, align 4186  ret void187}188 189; Prefer paired memops over rotate.190 191define void @rotate64(ptr %p) {192; A53-LABEL: rotate64:193; A53:       // %bb.0:194; A53-NEXT:    ldp w9, w8, [x0]195; A53-NEXT:    stp w8, w9, [x0, #8]196; A53-NEXT:    ret197  %p1 = getelementptr i32, ptr %p, i64 1198  %p2 = getelementptr i32, ptr %p, i64 2199  %p3 = getelementptr i32, ptr %p, i64 3200  %i0 = load i32, ptr %p, align 4201  %i1 = load i32, ptr %p1, align 4202  store i32 %i1, ptr %p2, align 4203  store i32 %i0, ptr %p3, align 4204  ret void205}206 207declare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i1)208declare i32 @fcntl(i32, i32, ...)209declare noalias ptr @foo()210