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
  
     | 
    
      ; 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
}
 
     |