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