; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2
; RUN: llc -mtriple=aarch64-apple-ios -global-isel -stop-after=irtranslator %s -o - | FileCheck %s --check-prefix=TRANSLATED
; RUN: llc -mtriple=aarch64-apple-ios -global-isel -stop-before=instruction-select %s -o - | FileCheck %s --check-prefix=PRESELECTION
; RUN: llc -mtriple=aarch64-apple-ios -global-isel -stop-after=instruction-select %s -o - | FileCheck %s --check-prefix=POSTSELECTION
; Check we generate G_CONSTANT_FOLD_BARRIER of constants and don't fold them, since they're
; used by constant hoisting to prevent constant folding/propagation.
declare void @callee()
define i32 @test(i32 %a, i1 %c) {
; TRANSLATED-LABEL: name: test
; TRANSLATED: bb.1.entry:
; TRANSLATED-NEXT: successors: %bb.3(0x40000000), %bb.2(0x40000000)
; TRANSLATED-NEXT: liveins: $w0, $w1
; TRANSLATED-NEXT: {{ $}}
; TRANSLATED-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
; TRANSLATED-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
; TRANSLATED-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY1]](s32)
; TRANSLATED-NEXT: [[ASSERT_ZEXT:%[0-9]+]]:_(s8) = G_ASSERT_ZEXT [[TRUNC]], 1
; TRANSLATED-NEXT: [[TRUNC1:%[0-9]+]]:_(s1) = G_TRUNC [[ASSERT_ZEXT]](s8)
; TRANSLATED-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 100000
; TRANSLATED-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
; TRANSLATED-NEXT: [[CONSTANT_FOLD_BARRIER:%[0-9]+]]:_(s32) = G_CONSTANT_FOLD_BARRIER [[C]]
; TRANSLATED-NEXT: G_BRCOND [[TRUNC1]](s1), %bb.3
; TRANSLATED-NEXT: G_BR %bb.2
; TRANSLATED-NEXT: {{ $}}
; TRANSLATED-NEXT: bb.2.common.ret:
; TRANSLATED-NEXT: [[PHI:%[0-9]+]]:_(s32) = G_PHI %7(s32), %bb.3, [[C1]](s32), %bb.1
; TRANSLATED-NEXT: $w0 = COPY [[PHI]](s32)
; TRANSLATED-NEXT: RET_ReallyLR implicit $w0
; TRANSLATED-NEXT: {{ $}}
; TRANSLATED-NEXT: bb.3.cont:
; TRANSLATED-NEXT: successors: %bb.2(0x80000000)
; TRANSLATED-NEXT: {{ $}}
; TRANSLATED-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[CONSTANT_FOLD_BARRIER]]
; TRANSLATED-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
; TRANSLATED-NEXT: BL @callee, csr_darwin_aarch64_aapcs, implicit-def $lr, implicit $sp
; TRANSLATED-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
; TRANSLATED-NEXT: G_BR %bb.2
;
; PRESELECTION-LABEL: name: test
; PRESELECTION: bb.1.entry:
; PRESELECTION-NEXT: successors: %bb.3(0x40000000), %bb.2(0x40000000)
; PRESELECTION-NEXT: liveins: $w0, $w1
; PRESELECTION-NEXT: {{ $}}
; PRESELECTION-NEXT: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w0
; PRESELECTION-NEXT: [[COPY1:%[0-9]+]]:gpr(s32) = COPY $w1
; PRESELECTION-NEXT: [[C:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 100000
; PRESELECTION-NEXT: [[CONSTANT_FOLD_BARRIER:%[0-9]+]]:gpr(s32) = G_CONSTANT_FOLD_BARRIER [[C]]
; PRESELECTION-NEXT: [[C1:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 0
; PRESELECTION-NEXT: [[C2:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 1
; PRESELECTION-NEXT: [[AND:%[0-9]+]]:gpr(s32) = G_AND [[COPY1]], [[C2]]
; PRESELECTION-NEXT: G_BRCOND [[AND]](s32), %bb.3
; PRESELECTION-NEXT: G_BR %bb.2
; PRESELECTION-NEXT: {{ $}}
; PRESELECTION-NEXT: bb.2.common.ret:
; PRESELECTION-NEXT: [[PHI:%[0-9]+]]:gpr(s32) = G_PHI %7(s32), %bb.3, [[C1]](s32), %bb.1
; PRESELECTION-NEXT: $w0 = COPY [[PHI]](s32)
; PRESELECTION-NEXT: RET_ReallyLR implicit $w0
; PRESELECTION-NEXT: {{ $}}
; PRESELECTION-NEXT: bb.3.cont:
; PRESELECTION-NEXT: successors: %bb.2(0x80000000)
; PRESELECTION-NEXT: {{ $}}
; PRESELECTION-NEXT: [[ADD:%[0-9]+]]:gpr(s32) = G_ADD [[COPY]], [[CONSTANT_FOLD_BARRIER]]
; PRESELECTION-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
; PRESELECTION-NEXT: BL @callee, csr_darwin_aarch64_aapcs, implicit-def $lr, implicit $sp
; PRESELECTION-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
; PRESELECTION-NEXT: G_BR %bb.2
;
; POSTSELECTION-LABEL: name: test
; POSTSELECTION: bb.1.entry:
; POSTSELECTION-NEXT: successors: %bb.3(0x40000000), %bb.2(0x40000000)
; POSTSELECTION-NEXT: liveins: $w0, $w1
; POSTSELECTION-NEXT: {{ $}}
; POSTSELECTION-NEXT: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
; POSTSELECTION-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
; POSTSELECTION-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = MOVi32imm 100000
; POSTSELECTION-NEXT: [[COPY2:%[0-9]+]]:gpr32 = COPY $wzr
; POSTSELECTION-NEXT: TBNZW [[COPY1]], 0, %bb.3
; POSTSELECTION-NEXT: B %bb.2
; POSTSELECTION-NEXT: {{ $}}
; POSTSELECTION-NEXT: bb.2.common.ret:
; POSTSELECTION-NEXT: [[PHI:%[0-9]+]]:gpr32 = PHI %7, %bb.3, [[COPY2]], %bb.1
; POSTSELECTION-NEXT: $w0 = COPY [[PHI]]
; POSTSELECTION-NEXT: RET_ReallyLR implicit $w0
; POSTSELECTION-NEXT: {{ $}}
; POSTSELECTION-NEXT: bb.3.cont:
; POSTSELECTION-NEXT: successors: %bb.2(0x80000000)
; POSTSELECTION-NEXT: {{ $}}
; POSTSELECTION-NEXT: [[ADDWrr:%[0-9]+]]:gpr32 = ADDWrr [[COPY]], [[MOVi32imm]]
; POSTSELECTION-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
; POSTSELECTION-NEXT: BL @callee, csr_darwin_aarch64_aapcs, implicit-def $lr, implicit $sp
; POSTSELECTION-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
; POSTSELECTION-NEXT: B %bb.2
entry:
%hc = bitcast i32 100000 to i32
br i1 %c, label %cont, label %end
cont:
%add = add i32 %a, %hc
call void @callee()
ret i32 %add
end:
ret i32 0
}