| 12
 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
 
 | # RUN: llc -o - %s -start-after=if-converter | FileCheck %s
--- |
  target datalayout = "E-m:e-i64:64-n32:64"
  target triple = "powerpc64-unknown-linux-gnu"
  
  %struct.rwlock_t.0.22.58.68.242.244 = type {}
  
  @tasklist_lock = external global %struct.rwlock_t.0.22.58.68.242.244, align 1
  
  ; Function Attrs: nounwind
  define void @mm_update_next_owner(i8** %p1, i32* %p2) #0 {
  entry:
    %0 = load i8*, i8** %p1, align 8
    br i1 undef, label %do.body.92, label %for.body.21
  
  for.body.21:                                      ; preds = %entry
    unreachable
  
  do.body.92:                                       ; preds = %entry
    %usage = getelementptr inbounds i8, i8* %0, i64 -48
    %counter.i = bitcast i8* %usage to i32*
    %call95 = tail call signext i32 bitcast (i32 (...)* @__raw_read_unlock to i32 (%struct.rwlock_t.0.22.58.68.242.244*)*)(%struct.rwlock_t.0.22.58.68.242.244* nonnull @tasklist_lock) #1
    store volatile i32 0, i32* %p2, align 4
    tail call void asm sideeffect "#compiler barrier", "~{memory}"() #1
    %1 = tail call i32 asm sideeffect "\0Alwsync \0A1:\09lwarx\09$0,0,$1\09\09# atomic_dec_return\0A\09addic\09$0,$0,-1\0A\09stwcx.\09$0,0,$1\0A\09bne-\091b\0Async \0A", "=&r,r,~{cc},~{xer},~{memory}"(i32* %counter.i) #1
    %cmp.i = icmp eq i32 %1, 0
    br i1 %cmp.i, label %if.then.i, label %put_task_struct.exit
  
  if.then.i:                                        ; preds = %do.body.92
    unreachable
  
  put_task_struct.exit:                             ; preds = %do.body.92
    ret void
  }
  
  declare signext i32 @__raw_read_unlock(...)
  
  attributes #0 = { nounwind "target-cpu"="pwr7" }
  attributes #1 = { nounwind }
...
---
name:            mm_update_next_owner
alignment:       4
exposesReturnsTwice: false
tracksRegLiveness: true
liveins:         
  - { reg: '%x3' }
  - { reg: '%x4' }
frameInfo:       
  isFrameAddressTaken: false
  isReturnAddressTaken: false
  hasStackMap:     false
  hasPatchPoint:   false
  stackSize:       144
  offsetAdjustment: 0
  maxAlignment:    0
  adjustsStack:    true
  hasCalls:        true
  maxCallFrameSize: 112
  hasOpaqueSPAdjustment: false
  hasVAStart:      false
  hasMustTailInVarArgFunc: false
fixedStack:      
  - { id: 0, type: spill-slot, offset: -16, size: 8, alignment: 16, callee-saved-register: '%x30' }
  - { id: 1, type: spill-slot, offset: -24, size: 8, alignment: 8, callee-saved-register: '%x29' }
body:             |
  bb.0.entry:
    liveins: %x3, %x4, %x29, %x30, %x29, %x30
  
    %x0 = MFLR8 implicit %lr8
    STD %x0, 16, %x1
    %x1 = STDU %x1, -144, %x1
    STD killed %x29, 120, %x1 :: (store 8 into %fixed-stack.1)
    STD killed %x30, 128, %x1 :: (store 8 into %fixed-stack.0, align 16)
    %x30 = OR8 %x4, %x4
    %x3 = LD 0, killed %x3 :: (load 8 from %ir.p1)
    %x29 = ADDI8 killed %x3, -48
    %x3 = ADDIStocHA %x2, @tasklist_lock
    %x3 = LDtocL @tasklist_lock, killed %x3, implicit %x2 :: (load 8 from got)
    BL8_NOP @__raw_read_unlock, csr_svr464_altivec, implicit-def %lr8, implicit %rm, implicit %x3, implicit %x2, implicit-def %r1, implicit-def dead %x3
    %r3 = LI 0
    STW killed %r3, 0, killed %x30 :: (volatile store 4 into %ir.p2)
    INLINEASM $"#compiler barrier", 25
    INLINEASM $"\0Alwsync \0A1:\09lwarx\09$0,0,$1\09\09# atomic_dec_return\0A\09addic\09$0,$0,-1\0A\09stwcx.\09$0,0,$1\0A\09bne-\091b\0Async \0A", 25, 131083, def early-clobber %r3, 851977, killed %x29, 12, implicit-def dead early-clobber %cr0
    ; CHECK-LABEL: @mm_update_next_owner
    ; CHECK-NOT: lwarx 29, 0, 29
    ; CHECK-NOT: stwcx. 29, 0, 29
    %cr0 = CMPLWI killed %r3, 0
    %x30 = LD 128, %x1 :: (load 8 from %fixed-stack.0, align 16)
    %x29 = LD 120, %x1 :: (load 8 from %fixed-stack.1)
    %x1 = ADDI8 %x1, 144
    %x0 = LD 16, %x1
    MTLR8 %x0, implicit-def %lr8
    BLR8 implicit %lr8, implicit %rm
...
 |