89 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 62; RUN: llc < %s -mtriple=x86_64-linux -stop-after=early-machinelicm -o - | FileCheck %s3 4; FIXME: MachineLICM does not compute register pressure correctly and we end up5; emitting too many ADD64ri32s. More details: llvm.org/PR231436 7%struct.A = type { i32, i32, i32, i32, i32, i32, i32 }8 9define void @test(i1 %b, ptr %a) nounwind {10 ; CHECK-LABEL: name: test11 ; CHECK: bb.0.entry:12 ; CHECK-NEXT: successors: %bb.1(0x80000000)13 ; CHECK-NEXT: liveins: $edi, $rsi14 ; CHECK-NEXT: {{ $}}15 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rsi16 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi17 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr8 = COPY [[COPY1]].sub_8bit18 ; CHECK-NEXT: [[ADD64ri32_:%[0-9]+]]:gr64 = nuw ADD64ri32 [[COPY]], 4, implicit-def dead $eflags19 ; CHECK-NEXT: [[ADD64ri32_1:%[0-9]+]]:gr64 = nuw ADD64ri32 [[COPY]], 8, implicit-def dead $eflags20 ; CHECK-NEXT: [[ADD64ri32_2:%[0-9]+]]:gr64 = nuw ADD64ri32 [[COPY]], 12, implicit-def dead $eflags21 ; CHECK-NEXT: [[ADD64ri32_3:%[0-9]+]]:gr64 = nuw ADD64ri32 [[COPY]], 16, implicit-def dead $eflags22 ; CHECK-NEXT: [[ADD64ri32_4:%[0-9]+]]:gr64 = nuw ADD64ri32 [[COPY]], 20, implicit-def dead $eflags23 ; CHECK-NEXT: [[ADD64ri32_5:%[0-9]+]]:gr64 = nuw ADD64ri32 [[COPY]], 24, implicit-def dead $eflags24 ; CHECK-NEXT: {{ $}}25 ; CHECK-NEXT: bb.1.loop-body:26 ; CHECK-NEXT: successors: %bb.1(0x7c000000), %bb.2(0x04000000)27 ; CHECK-NEXT: {{ $}}28 ; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp29 ; CHECK-NEXT: $rdi = COPY [[COPY]]30 ; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @assign, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit-def $rsp, implicit-def $ssp31 ; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp32 ; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp33 ; CHECK-NEXT: $rdi = COPY [[ADD64ri32_]]34 ; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @assign, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit-def $rsp, implicit-def $ssp35 ; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp36 ; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp37 ; CHECK-NEXT: $rdi = COPY [[ADD64ri32_1]]38 ; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @assign, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit-def $rsp, implicit-def $ssp39 ; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp40 ; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp41 ; CHECK-NEXT: $rdi = COPY [[ADD64ri32_2]]42 ; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @assign, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit-def $rsp, implicit-def $ssp43 ; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp44 ; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp45 ; CHECK-NEXT: $rdi = COPY [[ADD64ri32_3]]46 ; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @assign, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit-def $rsp, implicit-def $ssp47 ; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp48 ; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp49 ; CHECK-NEXT: $rdi = COPY [[ADD64ri32_4]]50 ; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @assign, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit-def $rsp, implicit-def $ssp51 ; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp52 ; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp53 ; CHECK-NEXT: $rdi = COPY [[ADD64ri32_5]]54 ; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @assign, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit-def $rsp, implicit-def $ssp55 ; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp56 ; CHECK-NEXT: TEST8ri [[COPY2]], 1, implicit-def $eflags57 ; CHECK-NEXT: JCC_1 %bb.1, 5, implicit $eflags58 ; CHECK-NEXT: JMP_1 %bb.259 ; CHECK-NEXT: {{ $}}60 ; CHECK-NEXT: bb.2.loop-exit:61 ; CHECK-NEXT: RET 062entry:63 br label %loop-header64 65loop-header:66 br label %loop-body67 68loop-body:69 %0 = getelementptr inbounds %struct.A, ptr %a, i64 0, i32 170 %1 = getelementptr inbounds %struct.A, ptr %a, i64 0, i32 271 %2 = getelementptr inbounds %struct.A, ptr %a, i64 0, i32 372 %3 = getelementptr inbounds %struct.A, ptr %a, i64 0, i32 473 %4 = getelementptr inbounds %struct.A, ptr %a, i64 0, i32 574 %5 = getelementptr inbounds %struct.A, ptr %a, i64 0, i32 675 call void @assign(ptr %a)76 call void @assign(ptr %0)77 call void @assign(ptr %1)78 call void @assign(ptr %2)79 call void @assign(ptr %3)80 call void @assign(ptr %4)81 call void @assign(ptr %5)82 br i1 %b, label %loop-body, label %loop-exit83 84loop-exit:85 ret void86}87 88declare void @assign(ptr)89