1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=ENABLE 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu %s -o - -enable-shrink-wrap=false | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE 3*9880d681SAndroid Build Coastguard Worker; 4*9880d681SAndroid Build Coastguard Worker; Note: Lots of tests use inline asm instead of regular calls. 5*9880d681SAndroid Build Coastguard Worker; This allows to have a better control on what the allocation will do. 6*9880d681SAndroid Build Coastguard Worker; Otherwise, we may have spill right in the entry block, defeating 7*9880d681SAndroid Build Coastguard Worker; shrink-wrapping. Moreover, some of the inline asm statement (nop) 8*9880d681SAndroid Build Coastguard Worker; are here to ensure that the related paths do not end up as critical 9*9880d681SAndroid Build Coastguard Worker; edges. 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; Initial motivating example: Simple diamond with a call just on one side. 13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo: 14*9880d681SAndroid Build Coastguard Worker; 15*9880d681SAndroid Build Coastguard Worker; Compare the arguments and return 16*9880d681SAndroid Build Coastguard Worker; No prologue needed. 17*9880d681SAndroid Build Coastguard Worker; ENABLE: cmpw 0, 3, 4 18*9880d681SAndroid Build Coastguard Worker; ENABLE-NEXT: bgelr 0 19*9880d681SAndroid Build Coastguard Worker; 20*9880d681SAndroid Build Coastguard Worker; Prologue code. 21*9880d681SAndroid Build Coastguard Worker; At a minimum, we save/restore the link register. Other registers may be saved 22*9880d681SAndroid Build Coastguard Worker; as well. 23*9880d681SAndroid Build Coastguard Worker; CHECK: mflr 24*9880d681SAndroid Build Coastguard Worker; 25*9880d681SAndroid Build Coastguard Worker; Compare the arguments and jump to exit. 26*9880d681SAndroid Build Coastguard Worker; After the prologue is set. 27*9880d681SAndroid Build Coastguard Worker; DISABLE: cmpw 0, 3, 4 28*9880d681SAndroid Build Coastguard Worker; DISABLE-NEXT: bge 0, .[[EXIT_LABEL:LBB[0-9_]+]] 29*9880d681SAndroid Build Coastguard Worker; 30*9880d681SAndroid Build Coastguard Worker; Store %a on the stack 31*9880d681SAndroid Build Coastguard Worker; CHECK: stw 3, {{[0-9]+([0-9]+)}} 32*9880d681SAndroid Build Coastguard Worker; Set the alloca address in the second argument. 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: addi 4, 1, {{[0-9]+}} 34*9880d681SAndroid Build Coastguard Worker; Set the first argument to zero. 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: li 3, 0 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bl doSomething 37*9880d681SAndroid Build Coastguard Worker; 38*9880d681SAndroid Build Coastguard Worker; With shrink-wrapping, epilogue is just after the call. 39*9880d681SAndroid Build Coastguard Worker; Restore the link register and return. 40*9880d681SAndroid Build Coastguard Worker; Note that there could be other epilog code before the link register is 41*9880d681SAndroid Build Coastguard Worker; restored but we will not check for it here. 42*9880d681SAndroid Build Coastguard Worker; ENABLE: mtlr 43*9880d681SAndroid Build Coastguard Worker; ENABLE-NEXT: blr 44*9880d681SAndroid Build Coastguard Worker; 45*9880d681SAndroid Build Coastguard Worker; DISABLE: [[EXIT_LABEL]]: 46*9880d681SAndroid Build Coastguard Worker; 47*9880d681SAndroid Build Coastguard Worker; Without shrink-wrapping, epilogue is in the exit block. 48*9880d681SAndroid Build Coastguard Worker; Epilogue code. (What we pop does not matter.) 49*9880d681SAndroid Build Coastguard Worker; DISABLE: mtlr {{[0-9]+}} 50*9880d681SAndroid Build Coastguard Worker; DISABLE-NEXT: blr 51*9880d681SAndroid Build Coastguard Worker; 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine i32 @foo(i32 %a, i32 %b) { 54*9880d681SAndroid Build Coastguard Worker %tmp = alloca i32, align 4 55*9880d681SAndroid Build Coastguard Worker %tmp2 = icmp slt i32 %a, %b 56*9880d681SAndroid Build Coastguard Worker br i1 %tmp2, label %true, label %false 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workertrue: 59*9880d681SAndroid Build Coastguard Worker store i32 %a, i32* %tmp, align 4 60*9880d681SAndroid Build Coastguard Worker %tmp4 = call i32 @doSomething(i32 0, i32* %tmp) 61*9880d681SAndroid Build Coastguard Worker br label %false 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerfalse: 64*9880d681SAndroid Build Coastguard Worker %tmp.0 = phi i32 [ %tmp4, %true ], [ %a, %0 ] 65*9880d681SAndroid Build Coastguard Worker ret i32 %tmp.0 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; Function Attrs: optsize 69*9880d681SAndroid Build Coastguard Workerdeclare i32 @doSomething(i32, i32*) 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker; Check that we do not perform the restore inside the loop whereas the save 74*9880d681SAndroid Build Coastguard Worker; is outside. 75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: freqSaveAndRestoreOutsideLoop: 76*9880d681SAndroid Build Coastguard Worker; 77*9880d681SAndroid Build Coastguard Worker; Shrink-wrapping allows to skip the prologue in the else case. 78*9880d681SAndroid Build Coastguard Worker; ENABLE: cmplwi 0, 3, 0 79*9880d681SAndroid Build Coastguard Worker; ENABLE: beq 0, .[[ELSE_LABEL:LBB[0-9_]+]] 80*9880d681SAndroid Build Coastguard Worker; 81*9880d681SAndroid Build Coastguard Worker; Prologue code. 82*9880d681SAndroid Build Coastguard Worker; Make sure we save the link register 83*9880d681SAndroid Build Coastguard Worker; CHECK: mflr {{[0-9]+}} 84*9880d681SAndroid Build Coastguard Worker; 85*9880d681SAndroid Build Coastguard Worker; DISABLE: cmplwi 0, 3, 0 86*9880d681SAndroid Build Coastguard Worker; DISABLE: beq 0, .[[ELSE_LABEL:LBB[0-9_]+]] 87*9880d681SAndroid Build Coastguard Worker; 88*9880d681SAndroid Build Coastguard Worker; Loop preheader 89*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[SUM:[0-9]+]], 0 90*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[IV:[0-9]+]], 10 91*9880d681SAndroid Build Coastguard Worker; 92*9880d681SAndroid Build Coastguard Worker; Loop body 93*9880d681SAndroid Build Coastguard Worker; CHECK: .[[LOOP:LBB[0-9_]+]]: # %for.body 94*9880d681SAndroid Build Coastguard Worker; CHECK: bl something 95*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: addi [[IV]], [[IV]], -1 96*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: add [[SUM]], 3, [[SUM]] 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmplwi [[IV]], 0 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bne 0, .[[LOOP]] 99*9880d681SAndroid Build Coastguard Worker; 100*9880d681SAndroid Build Coastguard Worker; Next BB. 101*9880d681SAndroid Build Coastguard Worker; CHECK: slwi 3, [[SUM]], 3 102*9880d681SAndroid Build Coastguard Worker; 103*9880d681SAndroid Build Coastguard Worker; Jump to epilogue. 104*9880d681SAndroid Build Coastguard Worker; DISABLE: b .[[EPILOG_BB:LBB[0-9_]+]] 105*9880d681SAndroid Build Coastguard Worker; 106*9880d681SAndroid Build Coastguard Worker; DISABLE: .[[ELSE_LABEL]]: # %if.else 107*9880d681SAndroid Build Coastguard Worker; Shift second argument by one and store into returned register. 108*9880d681SAndroid Build Coastguard Worker; DISABLE: slwi 3, 4, 1 109*9880d681SAndroid Build Coastguard Worker; DISABLE: .[[EPILOG_BB]]: # %if.end 110*9880d681SAndroid Build Coastguard Worker; 111*9880d681SAndroid Build Coastguard Worker; Epilogue code. 112*9880d681SAndroid Build Coastguard Worker; CHECK: mtlr {{[0-9]+}} 113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 114*9880d681SAndroid Build Coastguard Worker; 115*9880d681SAndroid Build Coastguard Worker; ENABLE: .[[ELSE_LABEL]]: # %if.else 116*9880d681SAndroid Build Coastguard Worker; Shift second argument by one and store into returned register. 117*9880d681SAndroid Build Coastguard Worker; ENABLE: slwi 3, 4, 1 118*9880d681SAndroid Build Coastguard Worker; ENABLE-NEXT: blr 119*9880d681SAndroid Build Coastguard Workerdefine i32 @freqSaveAndRestoreOutsideLoop(i32 %cond, i32 %N) { 120*9880d681SAndroid Build Coastguard Workerentry: 121*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %cond, 0 122*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.else, label %for.preheader 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Workerfor.preheader: 125*9880d681SAndroid Build Coastguard Worker tail call void asm "nop", ""() 126*9880d681SAndroid Build Coastguard Worker br label %for.body 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 129*9880d681SAndroid Build Coastguard Worker %i.05 = phi i32 [ %inc, %for.body ], [ 0, %for.preheader ] 130*9880d681SAndroid Build Coastguard Worker %sum.04 = phi i32 [ %add, %for.body ], [ 0, %for.preheader ] 131*9880d681SAndroid Build Coastguard Worker %call = tail call i32 bitcast (i32 (...)* @something to i32 ()*)() 132*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %call, %sum.04 133*9880d681SAndroid Build Coastguard Worker %inc = add nuw nsw i32 %i.05, 1 134*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %inc, 10 135*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 138*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %add, 3 139*9880d681SAndroid Build Coastguard Worker br label %if.end 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %entry 142*9880d681SAndroid Build Coastguard Worker %mul = shl nsw i32 %N, 1 143*9880d681SAndroid Build Coastguard Worker br label %if.end 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.else, %for.end 146*9880d681SAndroid Build Coastguard Worker %sum.1 = phi i32 [ %shl, %for.end ], [ %mul, %if.else ] 147*9880d681SAndroid Build Coastguard Worker ret i32 %sum.1 148*9880d681SAndroid Build Coastguard Worker} 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Workerdeclare i32 @something(...) 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker; Check that we do not perform the shrink-wrapping inside the loop even 153*9880d681SAndroid Build Coastguard Worker; though that would be legal. The cost model must prevent that. 154*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: freqSaveAndRestoreOutsideLoop2: 155*9880d681SAndroid Build Coastguard Worker; Prologue code. 156*9880d681SAndroid Build Coastguard Worker; Make sure we save the link register before the call 157*9880d681SAndroid Build Coastguard Worker; CHECK: mflr {{[0-9]+}} 158*9880d681SAndroid Build Coastguard Worker; 159*9880d681SAndroid Build Coastguard Worker; Loop preheader 160*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[SUM:[0-9]+]], 0 161*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[IV:[0-9]+]], 10 162*9880d681SAndroid Build Coastguard Worker; 163*9880d681SAndroid Build Coastguard Worker; Loop body 164*9880d681SAndroid Build Coastguard Worker; CHECK: .[[LOOP:LBB[0-9_]+]]: # %for.body 165*9880d681SAndroid Build Coastguard Worker; CHECK: bl something 166*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: addi [[IV]], [[IV]], -1 167*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: add [[SUM]], 3, [[SUM]] 168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmplwi [[IV]], 0 169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bne 0, .[[LOOP]] 170*9880d681SAndroid Build Coastguard Worker; 171*9880d681SAndroid Build Coastguard Worker; Next BB 172*9880d681SAndroid Build Coastguard Worker; CHECK: %for.end 173*9880d681SAndroid Build Coastguard Worker; CHECK: mtlr {{[0-9]+}} 174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 175*9880d681SAndroid Build Coastguard Workerdefine i32 @freqSaveAndRestoreOutsideLoop2(i32 %cond) { 176*9880d681SAndroid Build Coastguard Workerentry: 177*9880d681SAndroid Build Coastguard Worker br label %for.preheader 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Workerfor.preheader: 180*9880d681SAndroid Build Coastguard Worker tail call void asm "nop", ""() 181*9880d681SAndroid Build Coastguard Worker br label %for.body 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 184*9880d681SAndroid Build Coastguard Worker %i.04 = phi i32 [ 0, %for.preheader ], [ %inc, %for.body ] 185*9880d681SAndroid Build Coastguard Worker %sum.03 = phi i32 [ 0, %for.preheader ], [ %add, %for.body ] 186*9880d681SAndroid Build Coastguard Worker %call = tail call i32 bitcast (i32 (...)* @something to i32 ()*)() 187*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %call, %sum.03 188*9880d681SAndroid Build Coastguard Worker %inc = add nuw nsw i32 %i.04, 1 189*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %inc, 10 190*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.exit, label %for.body 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Workerfor.exit: 193*9880d681SAndroid Build Coastguard Worker tail call void asm "nop", ""() 194*9880d681SAndroid Build Coastguard Worker br label %for.end 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 197*9880d681SAndroid Build Coastguard Worker ret i32 %add 198*9880d681SAndroid Build Coastguard Worker} 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Worker; Check with a more complex case that we do not have save within the loop and 202*9880d681SAndroid Build Coastguard Worker; restore outside. 203*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: loopInfoSaveOutsideLoop: 204*9880d681SAndroid Build Coastguard Worker; 205*9880d681SAndroid Build Coastguard Worker; ENABLE: cmplwi 0, 3, 0 206*9880d681SAndroid Build Coastguard Worker; ENABLE-NEXT: beq 0, .[[ELSE_LABEL:LBB[0-9_]+]] 207*9880d681SAndroid Build Coastguard Worker; 208*9880d681SAndroid Build Coastguard Worker; Prologue code. 209*9880d681SAndroid Build Coastguard Worker; Make sure we save the link register 210*9880d681SAndroid Build Coastguard Worker; CHECK: mflr {{[0-9]+}} 211*9880d681SAndroid Build Coastguard Worker; 212*9880d681SAndroid Build Coastguard Worker; DISABLE: cmplwi 0, 3, 0 213*9880d681SAndroid Build Coastguard Worker; DISABLE-NEXT: beq 0, .[[ELSE_LABEL:LBB[0-9_]+]] 214*9880d681SAndroid Build Coastguard Worker; 215*9880d681SAndroid Build Coastguard Worker; Loop preheader 216*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[SUM:[0-9]+]], 0 217*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[IV:[0-9]+]], 10 218*9880d681SAndroid Build Coastguard Worker; 219*9880d681SAndroid Build Coastguard Worker; Loop body 220*9880d681SAndroid Build Coastguard Worker; CHECK: .[[LOOP:LBB[0-9_]+]]: # %for.body 221*9880d681SAndroid Build Coastguard Worker; CHECK: bl something 222*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: addi [[IV]], [[IV]], -1 223*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: add [[SUM]], 3, [[SUM]] 224*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmplwi [[IV]], 0 225*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bne 0, .[[LOOP]] 226*9880d681SAndroid Build Coastguard Worker; 227*9880d681SAndroid Build Coastguard Worker; Next BB 228*9880d681SAndroid Build Coastguard Worker; CHECK: bl somethingElse 229*9880d681SAndroid Build Coastguard Worker; CHECK: slwi 3, [[SUM]], 3 230*9880d681SAndroid Build Coastguard Worker; 231*9880d681SAndroid Build Coastguard Worker; Jump to epilogue 232*9880d681SAndroid Build Coastguard Worker; DISABLE: b .[[EPILOG_BB:LBB[0-9_]+]] 233*9880d681SAndroid Build Coastguard Worker; 234*9880d681SAndroid Build Coastguard Worker; DISABLE: .[[ELSE_LABEL]]: # %if.else 235*9880d681SAndroid Build Coastguard Worker; Shift second argument by one and store into returned register. 236*9880d681SAndroid Build Coastguard Worker; DISABLE: slwi 3, 4, 1 237*9880d681SAndroid Build Coastguard Worker; 238*9880d681SAndroid Build Coastguard Worker; DISABLE: .[[EPILOG_BB]]: # %if.end 239*9880d681SAndroid Build Coastguard Worker; Epilog code 240*9880d681SAndroid Build Coastguard Worker; CHECK: mtlr {{[0-9]+}} 241*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 242*9880d681SAndroid Build Coastguard Worker; 243*9880d681SAndroid Build Coastguard Worker; ENABLE: .[[ELSE_LABEL]]: # %if.else 244*9880d681SAndroid Build Coastguard Worker; Shift second argument by one and store into returned register. 245*9880d681SAndroid Build Coastguard Worker; ENABLE: slwi 3, 4, 1 246*9880d681SAndroid Build Coastguard Worker; ENABLE-NEXT: blr 247*9880d681SAndroid Build Coastguard Workerdefine i32 @loopInfoSaveOutsideLoop(i32 %cond, i32 %N) { 248*9880d681SAndroid Build Coastguard Workerentry: 249*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %cond, 0 250*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.else, label %for.preheader 251*9880d681SAndroid Build Coastguard Worker 252*9880d681SAndroid Build Coastguard Workerfor.preheader: 253*9880d681SAndroid Build Coastguard Worker tail call void asm "nop", ""() 254*9880d681SAndroid Build Coastguard Worker br label %for.body 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 257*9880d681SAndroid Build Coastguard Worker %i.05 = phi i32 [ %inc, %for.body ], [ 0, %for.preheader ] 258*9880d681SAndroid Build Coastguard Worker %sum.04 = phi i32 [ %add, %for.body ], [ 0, %for.preheader ] 259*9880d681SAndroid Build Coastguard Worker %call = tail call i32 bitcast (i32 (...)* @something to i32 ()*)() 260*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %call, %sum.04 261*9880d681SAndroid Build Coastguard Worker %inc = add nuw nsw i32 %i.05, 1 262*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %inc, 10 263*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 266*9880d681SAndroid Build Coastguard Worker tail call void bitcast (void (...)* @somethingElse to void ()*)() 267*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %add, 3 268*9880d681SAndroid Build Coastguard Worker br label %if.end 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %entry 271*9880d681SAndroid Build Coastguard Worker %mul = shl nsw i32 %N, 1 272*9880d681SAndroid Build Coastguard Worker br label %if.end 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.else, %for.end 275*9880d681SAndroid Build Coastguard Worker %sum.1 = phi i32 [ %shl, %for.end ], [ %mul, %if.else ] 276*9880d681SAndroid Build Coastguard Worker ret i32 %sum.1 277*9880d681SAndroid Build Coastguard Worker} 278*9880d681SAndroid Build Coastguard Worker 279*9880d681SAndroid Build Coastguard Workerdeclare void @somethingElse(...) 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker; Check with a more complex case that we do not have restore within the loop and 282*9880d681SAndroid Build Coastguard Worker; save outside. 283*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: loopInfoRestoreOutsideLoop: 284*9880d681SAndroid Build Coastguard Worker; 285*9880d681SAndroid Build Coastguard Worker; ENABLE: cmplwi 0, 3, 0 286*9880d681SAndroid Build Coastguard Worker; ENABLE-NEXT: beq 0, .[[ELSE_LABEL:LBB[0-9_]+]] 287*9880d681SAndroid Build Coastguard Worker; 288*9880d681SAndroid Build Coastguard Worker; Prologue code. 289*9880d681SAndroid Build Coastguard Worker; Make sure we save the link register 290*9880d681SAndroid Build Coastguard Worker; CHECK: mflr {{[0-9]+}} 291*9880d681SAndroid Build Coastguard Worker; 292*9880d681SAndroid Build Coastguard Worker; DISABLE: cmplwi 0, 3, 0 293*9880d681SAndroid Build Coastguard Worker; DISABLE-NEXT: beq 0, .[[ELSE_LABEL:LBB[0-9_]+]] 294*9880d681SAndroid Build Coastguard Worker; 295*9880d681SAndroid Build Coastguard Worker; CHECK: bl somethingElse 296*9880d681SAndroid Build Coastguard Worker; 297*9880d681SAndroid Build Coastguard Worker; Loop preheader 298*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[SUM:[0-9]+]], 0 299*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: li [[IV:[0-9]+]], 10 300*9880d681SAndroid Build Coastguard Worker; 301*9880d681SAndroid Build Coastguard Worker; Loop body 302*9880d681SAndroid Build Coastguard Worker; CHECK: .[[LOOP:LBB[0-9_]+]]: # %for.body 303*9880d681SAndroid Build Coastguard Worker; CHECK: bl something 304*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: addi [[IV]], [[IV]], -1 305*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: add [[SUM]], 3, [[SUM]] 306*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmplwi [[IV]], 0 307*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bne 0, .[[LOOP]] 308*9880d681SAndroid Build Coastguard Worker; 309*9880d681SAndroid Build Coastguard Worker; Next BB. 310*9880d681SAndroid Build Coastguard Worker; slwi 3, [[SUM]], 3 311*9880d681SAndroid Build Coastguard Worker; 312*9880d681SAndroid Build Coastguard Worker; DISABLE: b .[[EPILOG_BB:LBB[0-9_]+]] 313*9880d681SAndroid Build Coastguard Worker; 314*9880d681SAndroid Build Coastguard Worker; DISABLE: .[[ELSE_LABEL]]: # %if.else 315*9880d681SAndroid Build Coastguard Worker; Shift second argument by one and store into returned register. 316*9880d681SAndroid Build Coastguard Worker; DISABLE: slwi 3, 4, 1 317*9880d681SAndroid Build Coastguard Worker; DISABLE: .[[EPILOG_BB]]: # %if.end 318*9880d681SAndroid Build Coastguard Worker; 319*9880d681SAndroid Build Coastguard Worker; Epilogue code. 320*9880d681SAndroid Build Coastguard Worker; CHECK: mtlr {{[0-9]+}} 321*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 322*9880d681SAndroid Build Coastguard Worker; 323*9880d681SAndroid Build Coastguard Worker; ENABLE: .[[ELSE_LABEL]]: # %if.else 324*9880d681SAndroid Build Coastguard Worker; Shift second argument by one and store into returned register. 325*9880d681SAndroid Build Coastguard Worker; ENABLE: slwi 3, 4, 1 326*9880d681SAndroid Build Coastguard Worker; ENABLE-NEXT: blr 327*9880d681SAndroid Build Coastguard Workerdefine i32 @loopInfoRestoreOutsideLoop(i32 %cond, i32 %N) #0 { 328*9880d681SAndroid Build Coastguard Workerentry: 329*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %cond, 0 330*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.else, label %if.then 331*9880d681SAndroid Build Coastguard Worker 332*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 333*9880d681SAndroid Build Coastguard Worker tail call void bitcast (void (...)* @somethingElse to void ()*)() 334*9880d681SAndroid Build Coastguard Worker br label %for.body 335*9880d681SAndroid Build Coastguard Worker 336*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %if.then 337*9880d681SAndroid Build Coastguard Worker %i.05 = phi i32 [ 0, %if.then ], [ %inc, %for.body ] 338*9880d681SAndroid Build Coastguard Worker %sum.04 = phi i32 [ 0, %if.then ], [ %add, %for.body ] 339*9880d681SAndroid Build Coastguard Worker %call = tail call i32 bitcast (i32 (...)* @something to i32 ()*)() 340*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %call, %sum.04 341*9880d681SAndroid Build Coastguard Worker %inc = add nuw nsw i32 %i.05, 1 342*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %inc, 10 343*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body 344*9880d681SAndroid Build Coastguard Worker 345*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 346*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %add, 3 347*9880d681SAndroid Build Coastguard Worker br label %if.end 348*9880d681SAndroid Build Coastguard Worker 349*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %entry 350*9880d681SAndroid Build Coastguard Worker %mul = shl nsw i32 %N, 1 351*9880d681SAndroid Build Coastguard Worker br label %if.end 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.else, %for.end 354*9880d681SAndroid Build Coastguard Worker %sum.1 = phi i32 [ %shl, %for.end ], [ %mul, %if.else ] 355*9880d681SAndroid Build Coastguard Worker ret i32 %sum.1 356*9880d681SAndroid Build Coastguard Worker} 357*9880d681SAndroid Build Coastguard Worker 358*9880d681SAndroid Build Coastguard Worker; Check that we handle function with no frame information correctly. 359*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: emptyFrame: 360*9880d681SAndroid Build Coastguard Worker; CHECK: # %entry 361*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: li 3, 0 362*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 363*9880d681SAndroid Build Coastguard Workerdefine i32 @emptyFrame() { 364*9880d681SAndroid Build Coastguard Workerentry: 365*9880d681SAndroid Build Coastguard Worker ret i32 0 366*9880d681SAndroid Build Coastguard Worker} 367*9880d681SAndroid Build Coastguard Worker 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Worker; Check that we handle inline asm correctly. 370*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: inlineAsm: 371*9880d681SAndroid Build Coastguard Worker; 372*9880d681SAndroid Build Coastguard Worker; ENABLE: cmplwi 0, 3, 0 373*9880d681SAndroid Build Coastguard Worker; ENABLE-NEXT: beq 0, .[[ELSE_LABEL:LBB[0-9_]+]] 374*9880d681SAndroid Build Coastguard Worker; 375*9880d681SAndroid Build Coastguard Worker; Prologue code. 376*9880d681SAndroid Build Coastguard Worker; Make sure we save the CSR used in the inline asm: r14 377*9880d681SAndroid Build Coastguard Worker; ENABLE-DAG: li [[IV:[0-9]+]], 10 378*9880d681SAndroid Build Coastguard Worker; ENABLE-DAG: std 14, -[[STACK_OFFSET:[0-9]+]](1) # 8-byte Folded Spill 379*9880d681SAndroid Build Coastguard Worker; 380*9880d681SAndroid Build Coastguard Worker; DISABLE: std 14, -[[STACK_OFFSET:[0-9]+]](1) # 8-byte Folded Spill 381*9880d681SAndroid Build Coastguard Worker; DISABLE: cmplwi 0, 3, 0 382*9880d681SAndroid Build Coastguard Worker; DISABLE-NEXT: beq 0, .[[ELSE_LABEL:LBB[0-9_]+]] 383*9880d681SAndroid Build Coastguard Worker; DISABLE: li [[IV:[0-9]+]], 10 384*9880d681SAndroid Build Coastguard Worker; 385*9880d681SAndroid Build Coastguard Worker; CHECK: nop 386*9880d681SAndroid Build Coastguard Worker; CHECK: mtctr [[IV]] 387*9880d681SAndroid Build Coastguard Worker; 388*9880d681SAndroid Build Coastguard Worker; CHECK: .[[LOOP_LABEL:LBB[0-9_]+]]: # %for.body 389*9880d681SAndroid Build Coastguard Worker; Inline asm statement. 390*9880d681SAndroid Build Coastguard Worker; CHECK: addi 14, 14, 1 391*9880d681SAndroid Build Coastguard Worker; CHECK: bdnz .[[LOOP_LABEL]] 392*9880d681SAndroid Build Coastguard Worker; 393*9880d681SAndroid Build Coastguard Worker; Epilogue code. 394*9880d681SAndroid Build Coastguard Worker; CHECK: li 3, 0 395*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ld 14, -[[STACK_OFFSET]](1) # 8-byte Folded Reload 396*9880d681SAndroid Build Coastguard Worker; CHECK: nop 397*9880d681SAndroid Build Coastguard Worker; CHECK: blr 398*9880d681SAndroid Build Coastguard Worker; 399*9880d681SAndroid Build Coastguard Worker; CHECK: [[ELSE_LABEL]] 400*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: slwi 3, 4, 1 401*9880d681SAndroid Build Coastguard Worker; DISABLE: ld 14, -[[STACK_OFFSET]](1) # 8-byte Folded Reload 402*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT blr 403*9880d681SAndroid Build Coastguard Worker; 404*9880d681SAndroid Build Coastguard Workerdefine i32 @inlineAsm(i32 %cond, i32 %N) { 405*9880d681SAndroid Build Coastguard Workerentry: 406*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %cond, 0 407*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.else, label %for.preheader 408*9880d681SAndroid Build Coastguard Worker 409*9880d681SAndroid Build Coastguard Workerfor.preheader: 410*9880d681SAndroid Build Coastguard Worker tail call void asm "nop", ""() 411*9880d681SAndroid Build Coastguard Worker br label %for.body 412*9880d681SAndroid Build Coastguard Worker 413*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 414*9880d681SAndroid Build Coastguard Worker %i.03 = phi i32 [ %inc, %for.body ], [ 0, %for.preheader ] 415*9880d681SAndroid Build Coastguard Worker tail call void asm "addi 14, 14, 1", "~{r14}"() 416*9880d681SAndroid Build Coastguard Worker %inc = add nuw nsw i32 %i.03, 1 417*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %inc, 10 418*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.exit, label %for.body 419*9880d681SAndroid Build Coastguard Worker 420*9880d681SAndroid Build Coastguard Workerfor.exit: 421*9880d681SAndroid Build Coastguard Worker tail call void asm "nop", ""() 422*9880d681SAndroid Build Coastguard Worker br label %if.end 423*9880d681SAndroid Build Coastguard Worker 424*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %entry 425*9880d681SAndroid Build Coastguard Worker %mul = shl nsw i32 %N, 1 426*9880d681SAndroid Build Coastguard Worker br label %if.end 427*9880d681SAndroid Build Coastguard Worker 428*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %for.body, %if.else 429*9880d681SAndroid Build Coastguard Worker %sum.0 = phi i32 [ %mul, %if.else ], [ 0, %for.exit ] 430*9880d681SAndroid Build Coastguard Worker ret i32 %sum.0 431*9880d681SAndroid Build Coastguard Worker} 432*9880d681SAndroid Build Coastguard Worker 433*9880d681SAndroid Build Coastguard Worker 434*9880d681SAndroid Build Coastguard Worker; Check that we handle calls to variadic functions correctly. 435*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: callVariadicFunc: 436*9880d681SAndroid Build Coastguard Worker; 437*9880d681SAndroid Build Coastguard Worker; ENABLE: cmplwi 0, 3, 0 438*9880d681SAndroid Build Coastguard Worker; ENABLE-NEXT: beq 0, .[[ELSE_LABEL:LBB[0-9_]+]] 439*9880d681SAndroid Build Coastguard Worker; 440*9880d681SAndroid Build Coastguard Worker; Prologue code. 441*9880d681SAndroid Build Coastguard Worker; CHECK: mflr {{[0-9]+}} 442*9880d681SAndroid Build Coastguard Worker; 443*9880d681SAndroid Build Coastguard Worker; DISABLE: cmplwi 0, 3, 0 444*9880d681SAndroid Build Coastguard Worker; DISABLE-NEXT: beq 0, .[[ELSE_LABEL:LBB[0-9_]+]] 445*9880d681SAndroid Build Coastguard Worker; 446*9880d681SAndroid Build Coastguard Worker; Setup of the varags. 447*9880d681SAndroid Build Coastguard Worker; CHECK: mr 4, 3 448*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mr 5, 3 449*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mr 6, 3 450*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mr 7, 3 451*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mr 8, 3 452*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mr 9, 3 453*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bl someVariadicFunc 454*9880d681SAndroid Build Coastguard Worker; CHECK: slwi 3, 3, 3 455*9880d681SAndroid Build Coastguard Worker; DISABLE: b .[[EPILOGUE_BB:LBB[0-9_]+]] 456*9880d681SAndroid Build Coastguard Worker; 457*9880d681SAndroid Build Coastguard Worker; ENABLE: mtlr {{[0-9]+}} 458*9880d681SAndroid Build Coastguard Worker; ENABLE-NEXT: blr 459*9880d681SAndroid Build Coastguard Worker; 460*9880d681SAndroid Build Coastguard Worker; CHECK: .[[ELSE_LABEL]]: # %if.else 461*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: slwi 3, 4, 1 462*9880d681SAndroid Build Coastguard Worker; 463*9880d681SAndroid Build Coastguard Worker; DISABLE: .[[EPILOGUE_BB]]: # %if.end 464*9880d681SAndroid Build Coastguard Worker; DISABLE: mtlr 465*9880d681SAndroid Build Coastguard Worker; CHECK: blr 466*9880d681SAndroid Build Coastguard Workerdefine i32 @callVariadicFunc(i32 %cond, i32 %N) { 467*9880d681SAndroid Build Coastguard Workerentry: 468*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %cond, 0 469*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.else, label %if.then 470*9880d681SAndroid Build Coastguard Worker 471*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 472*9880d681SAndroid Build Coastguard Worker %call = tail call i32 (i32, ...) @someVariadicFunc(i32 %N, i32 %N, i32 %N, i32 %N, i32 %N, i32 %N, i32 %N) 473*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %call, 3 474*9880d681SAndroid Build Coastguard Worker br label %if.end 475*9880d681SAndroid Build Coastguard Worker 476*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %entry 477*9880d681SAndroid Build Coastguard Worker %mul = shl nsw i32 %N, 1 478*9880d681SAndroid Build Coastguard Worker br label %if.end 479*9880d681SAndroid Build Coastguard Worker 480*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.else, %if.then 481*9880d681SAndroid Build Coastguard Worker %sum.0 = phi i32 [ %shl, %if.then ], [ %mul, %if.else ] 482*9880d681SAndroid Build Coastguard Worker ret i32 %sum.0 483*9880d681SAndroid Build Coastguard Worker} 484*9880d681SAndroid Build Coastguard Worker 485*9880d681SAndroid Build Coastguard Workerdeclare i32 @someVariadicFunc(i32, ...) 486*9880d681SAndroid Build Coastguard Worker 487*9880d681SAndroid Build Coastguard Worker 488*9880d681SAndroid Build Coastguard Worker 489*9880d681SAndroid Build Coastguard Worker; Make sure we do not insert unreachable code after noreturn function. 490*9880d681SAndroid Build Coastguard Worker; Although this is not incorrect to insert such code, it is useless 491*9880d681SAndroid Build Coastguard Worker; and it hurts the binary size. 492*9880d681SAndroid Build Coastguard Worker; 493*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: noreturn: 494*9880d681SAndroid Build Coastguard Worker; DISABLE: mflr {{[0-9]+}} 495*9880d681SAndroid Build Coastguard Worker; 496*9880d681SAndroid Build Coastguard Worker; CHECK: cmplwi 3, 0 497*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bne{{[-]?}} 0, .[[ABORT:LBB[0-9_]+]] 498*9880d681SAndroid Build Coastguard Worker; 499*9880d681SAndroid Build Coastguard Worker; CHECK: li 3, 42 500*9880d681SAndroid Build Coastguard Worker; 501*9880d681SAndroid Build Coastguard Worker; DISABLE: mtlr {{[0-9]+}} 502*9880d681SAndroid Build Coastguard Worker; 503*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 504*9880d681SAndroid Build Coastguard Worker; 505*9880d681SAndroid Build Coastguard Worker; CHECK: .[[ABORT]]: # %if.abort 506*9880d681SAndroid Build Coastguard Worker; 507*9880d681SAndroid Build Coastguard Worker; ENABLE: mflr {{[0-9]+}} 508*9880d681SAndroid Build Coastguard Worker; 509*9880d681SAndroid Build Coastguard Worker; CHECK: bl abort 510*9880d681SAndroid Build Coastguard Worker; ENABLE-NOT: mtlr {{[0-9]+}} 511*9880d681SAndroid Build Coastguard Workerdefine i32 @noreturn(i8 signext %bad_thing) { 512*9880d681SAndroid Build Coastguard Workerentry: 513*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i8 %bad_thing, 0 514*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.end, label %if.abort 515*9880d681SAndroid Build Coastguard Worker 516*9880d681SAndroid Build Coastguard Workerif.abort: 517*9880d681SAndroid Build Coastguard Worker tail call void @abort() #0 518*9880d681SAndroid Build Coastguard Worker unreachable 519*9880d681SAndroid Build Coastguard Worker 520*9880d681SAndroid Build Coastguard Workerif.end: 521*9880d681SAndroid Build Coastguard Worker ret i32 42 522*9880d681SAndroid Build Coastguard Worker} 523*9880d681SAndroid Build Coastguard Worker 524*9880d681SAndroid Build Coastguard Workerdeclare void @abort() #0 525*9880d681SAndroid Build Coastguard Worker 526*9880d681SAndroid Build Coastguard Workerattributes #0 = { noreturn nounwind } 527*9880d681SAndroid Build Coastguard Worker 528*9880d681SAndroid Build Coastguard Worker 529*9880d681SAndroid Build Coastguard Worker; Make sure that we handle infinite loops properly When checking that the Save 530*9880d681SAndroid Build Coastguard Worker; and Restore blocks are control flow equivalent, the loop searches for the 531*9880d681SAndroid Build Coastguard Worker; immediate (post) dominator for the (restore) save blocks. When either the Save 532*9880d681SAndroid Build Coastguard Worker; or Restore block is located in an infinite loop the only immediate (post) 533*9880d681SAndroid Build Coastguard Worker; dominator is itself. In this case, we cannot perform shrink wrapping, but we 534*9880d681SAndroid Build Coastguard Worker; should return gracefully and continue compilation. 535*9880d681SAndroid Build Coastguard Worker; The only condition for this test is the compilation finishes correctly. 536*9880d681SAndroid Build Coastguard Worker; 537*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: infiniteloop 538*9880d681SAndroid Build Coastguard Worker; CHECK: blr 539*9880d681SAndroid Build Coastguard Workerdefine void @infiniteloop() { 540*9880d681SAndroid Build Coastguard Workerentry: 541*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if.then, label %if.end 542*9880d681SAndroid Build Coastguard Worker 543*9880d681SAndroid Build Coastguard Workerif.then: 544*9880d681SAndroid Build Coastguard Worker %ptr = alloca i32, i32 4 545*9880d681SAndroid Build Coastguard Worker br label %for.body 546*9880d681SAndroid Build Coastguard Worker 547*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 548*9880d681SAndroid Build Coastguard Worker %sum.03 = phi i32 [ 0, %if.then ], [ %add, %for.body ] 549*9880d681SAndroid Build Coastguard Worker %call = tail call i32 bitcast (i32 (...)* @something to i32 ()*)() 550*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %call, %sum.03 551*9880d681SAndroid Build Coastguard Worker store i32 %add, i32* %ptr 552*9880d681SAndroid Build Coastguard Worker br label %for.body 553*9880d681SAndroid Build Coastguard Worker 554*9880d681SAndroid Build Coastguard Workerif.end: 555*9880d681SAndroid Build Coastguard Worker ret void 556*9880d681SAndroid Build Coastguard Worker} 557*9880d681SAndroid Build Coastguard Worker 558*9880d681SAndroid Build Coastguard Worker; Another infinite loop test this time with a body bigger than just one block. 559*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: infiniteloop2 560*9880d681SAndroid Build Coastguard Worker; CHECK: blr 561*9880d681SAndroid Build Coastguard Workerdefine void @infiniteloop2() { 562*9880d681SAndroid Build Coastguard Workerentry: 563*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if.then, label %if.end 564*9880d681SAndroid Build Coastguard Worker 565*9880d681SAndroid Build Coastguard Workerif.then: 566*9880d681SAndroid Build Coastguard Worker %ptr = alloca i32, i32 4 567*9880d681SAndroid Build Coastguard Worker br label %for.body 568*9880d681SAndroid Build Coastguard Worker 569*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 570*9880d681SAndroid Build Coastguard Worker %sum.03 = phi i32 [ 0, %if.then ], [ %add, %body1 ], [ 1, %body2] 571*9880d681SAndroid Build Coastguard Worker %call = tail call i32 asm "mftb $0, 268", "=r,~{r14}"() 572*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %call, %sum.03 573*9880d681SAndroid Build Coastguard Worker store i32 %add, i32* %ptr 574*9880d681SAndroid Build Coastguard Worker br i1 undef, label %body1, label %body2 575*9880d681SAndroid Build Coastguard Worker 576*9880d681SAndroid Build Coastguard Workerbody1: 577*9880d681SAndroid Build Coastguard Worker tail call void asm sideeffect "nop", "~{r14}"() 578*9880d681SAndroid Build Coastguard Worker br label %for.body 579*9880d681SAndroid Build Coastguard Worker 580*9880d681SAndroid Build Coastguard Workerbody2: 581*9880d681SAndroid Build Coastguard Worker tail call void asm sideeffect "nop", "~{r14}"() 582*9880d681SAndroid Build Coastguard Worker br label %for.body 583*9880d681SAndroid Build Coastguard Worker 584*9880d681SAndroid Build Coastguard Workerif.end: 585*9880d681SAndroid Build Coastguard Worker ret void 586*9880d681SAndroid Build Coastguard Worker} 587*9880d681SAndroid Build Coastguard Worker 588*9880d681SAndroid Build Coastguard Worker; Another infinite loop test this time with two nested infinite loop. 589*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: infiniteloop3 590*9880d681SAndroid Build Coastguard Worker; CHECK: # %end 591*9880d681SAndroid Build Coastguard Workerdefine void @infiniteloop3() { 592*9880d681SAndroid Build Coastguard Workerentry: 593*9880d681SAndroid Build Coastguard Worker br i1 undef, label %loop2a, label %body 594*9880d681SAndroid Build Coastguard Worker 595*9880d681SAndroid Build Coastguard Workerbody: ; preds = %entry 596*9880d681SAndroid Build Coastguard Worker br i1 undef, label %loop2a, label %end 597*9880d681SAndroid Build Coastguard Worker 598*9880d681SAndroid Build Coastguard Workerloop1: ; preds = %loop2a, %loop2b 599*9880d681SAndroid Build Coastguard Worker %var.phi = phi i32* [ %next.phi, %loop2b ], [ %var, %loop2a ] 600*9880d681SAndroid Build Coastguard Worker %next.phi = phi i32* [ %next.load, %loop2b ], [ %next.var, %loop2a ] 601*9880d681SAndroid Build Coastguard Worker %0 = icmp eq i32* %var, null 602*9880d681SAndroid Build Coastguard Worker %next.load = load i32*, i32** undef 603*9880d681SAndroid Build Coastguard Worker br i1 %0, label %loop2a, label %loop2b 604*9880d681SAndroid Build Coastguard Worker 605*9880d681SAndroid Build Coastguard Workerloop2a: ; preds = %loop1, %body, %entry 606*9880d681SAndroid Build Coastguard Worker %var = phi i32* [ null, %body ], [ null, %entry ], [ %next.phi, %loop1 ] 607*9880d681SAndroid Build Coastguard Worker %next.var = phi i32* [ undef, %body ], [ null, %entry ], [ %next.load, %loop1 ] 608*9880d681SAndroid Build Coastguard Worker br label %loop1 609*9880d681SAndroid Build Coastguard Worker 610*9880d681SAndroid Build Coastguard Workerloop2b: ; preds = %loop1 611*9880d681SAndroid Build Coastguard Worker %gep1 = bitcast i32* %var.phi to i32* 612*9880d681SAndroid Build Coastguard Worker %next.ptr = bitcast i32* %gep1 to i32** 613*9880d681SAndroid Build Coastguard Worker store i32* %next.phi, i32** %next.ptr 614*9880d681SAndroid Build Coastguard Worker br label %loop1 615*9880d681SAndroid Build Coastguard Worker 616*9880d681SAndroid Build Coastguard Workerend: 617*9880d681SAndroid Build Coastguard Worker ret void 618*9880d681SAndroid Build Coastguard Worker} 619*9880d681SAndroid Build Coastguard Worker 620*9880d681SAndroid Build Coastguard Worker@columns = external global [0 x i32], align 4 621*9880d681SAndroid Build Coastguard Worker@lock = common global i32 0, align 4 622*9880d681SAndroid Build Coastguard Worker@htindex = common global i32 0, align 4 623*9880d681SAndroid Build Coastguard Worker@stride = common global i32 0, align 4 624*9880d681SAndroid Build Coastguard Worker@ht = common global i32* null, align 8 625*9880d681SAndroid Build Coastguard Worker@he = common global i8* null, align 8 626*9880d681SAndroid Build Coastguard Worker 627*9880d681SAndroid Build Coastguard Worker; Test for a bug that was caused when save point was equal to restore point. 628*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind 629*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: transpose 630*9880d681SAndroid Build Coastguard Worker; 631*9880d681SAndroid Build Coastguard Worker; Store of callee-save register saved by shrink wrapping 632*9880d681SAndroid Build Coastguard Worker; FIXME: Test disabled: Improved scheduling needs no spills/reloads any longer! 633*9880d681SAndroid Build Coastguard Worker; CHECKXX: std [[CSR:[0-9]+]], -[[STACK_OFFSET:[0-9]+]](1) # 8-byte Folded Spill 634*9880d681SAndroid Build Coastguard Worker; 635*9880d681SAndroid Build Coastguard Worker; Reload of callee-save register 636*9880d681SAndroid Build Coastguard Worker; CHECKXX: ld [[CSR]], -[[STACK_OFFSET]](1) # 8-byte Folded Reload 637*9880d681SAndroid Build Coastguard Worker; 638*9880d681SAndroid Build Coastguard Worker; Ensure no subsequent uses of callee-save register before end of function 639*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{[a-z]+}} [[CSR]] 640*9880d681SAndroid Build Coastguard Worker; CHECK: blr 641*9880d681SAndroid Build Coastguard Workerdefine signext i32 @transpose() { 642*9880d681SAndroid Build Coastguard Workerentry: 643*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @columns, i64 0, i64 1), align 4 644*9880d681SAndroid Build Coastguard Worker %shl.i = shl i32 %0, 7 645*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @columns, i64 0, i64 2), align 4 646*9880d681SAndroid Build Coastguard Worker %or.i = or i32 %shl.i, %1 647*9880d681SAndroid Build Coastguard Worker %shl1.i = shl i32 %or.i, 7 648*9880d681SAndroid Build Coastguard Worker %2 = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @columns, i64 0, i64 3), align 4 649*9880d681SAndroid Build Coastguard Worker %or2.i = or i32 %shl1.i, %2 650*9880d681SAndroid Build Coastguard Worker %3 = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @columns, i64 0, i64 7), align 4 651*9880d681SAndroid Build Coastguard Worker %shl3.i = shl i32 %3, 7 652*9880d681SAndroid Build Coastguard Worker %4 = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @columns, i64 0, i64 6), align 4 653*9880d681SAndroid Build Coastguard Worker %or4.i = or i32 %shl3.i, %4 654*9880d681SAndroid Build Coastguard Worker %shl5.i = shl i32 %or4.i, 7 655*9880d681SAndroid Build Coastguard Worker %5 = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @columns, i64 0, i64 5), align 4 656*9880d681SAndroid Build Coastguard Worker %or6.i = or i32 %shl5.i, %5 657*9880d681SAndroid Build Coastguard Worker %cmp.i = icmp ugt i32 %or2.i, %or6.i 658*9880d681SAndroid Build Coastguard Worker br i1 %cmp.i, label %cond.true.i, label %cond.false.i 659*9880d681SAndroid Build Coastguard Worker 660*9880d681SAndroid Build Coastguard Workercond.true.i: 661*9880d681SAndroid Build Coastguard Worker %shl7.i = shl i32 %or2.i, 7 662*9880d681SAndroid Build Coastguard Worker %6 = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @columns, i64 0, i64 4), align 4 663*9880d681SAndroid Build Coastguard Worker %or8.i = or i32 %6, %shl7.i 664*9880d681SAndroid Build Coastguard Worker %conv.i = zext i32 %or8.i to i64 665*9880d681SAndroid Build Coastguard Worker %shl9.i = shl nuw nsw i64 %conv.i, 21 666*9880d681SAndroid Build Coastguard Worker %conv10.i = zext i32 %or6.i to i64 667*9880d681SAndroid Build Coastguard Worker %or11.i = or i64 %shl9.i, %conv10.i 668*9880d681SAndroid Build Coastguard Worker br label %hash.exit 669*9880d681SAndroid Build Coastguard Worker 670*9880d681SAndroid Build Coastguard Workercond.false.i: 671*9880d681SAndroid Build Coastguard Worker %shl12.i = shl i32 %or6.i, 7 672*9880d681SAndroid Build Coastguard Worker %7 = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @columns, i64 0, i64 4), align 4 673*9880d681SAndroid Build Coastguard Worker %or13.i = or i32 %7, %shl12.i 674*9880d681SAndroid Build Coastguard Worker %conv14.i = zext i32 %or13.i to i64 675*9880d681SAndroid Build Coastguard Worker %shl15.i = shl nuw nsw i64 %conv14.i, 21 676*9880d681SAndroid Build Coastguard Worker %conv16.i = zext i32 %or2.i to i64 677*9880d681SAndroid Build Coastguard Worker %or17.i = or i64 %shl15.i, %conv16.i 678*9880d681SAndroid Build Coastguard Worker br label %hash.exit 679*9880d681SAndroid Build Coastguard Worker 680*9880d681SAndroid Build Coastguard Workerhash.exit: 681*9880d681SAndroid Build Coastguard Worker %cond.i = phi i64 [ %or11.i, %cond.true.i ], [ %or17.i, %cond.false.i ] 682*9880d681SAndroid Build Coastguard Worker %shr.29.i = lshr i64 %cond.i, 17 683*9880d681SAndroid Build Coastguard Worker %conv18.i = trunc i64 %shr.29.i to i32 684*9880d681SAndroid Build Coastguard Worker store i32 %conv18.i, i32* @lock, align 4 685*9880d681SAndroid Build Coastguard Worker %rem.i = srem i64 %cond.i, 1050011 686*9880d681SAndroid Build Coastguard Worker %conv19.i = trunc i64 %rem.i to i32 687*9880d681SAndroid Build Coastguard Worker store i32 %conv19.i, i32* @htindex, align 4 688*9880d681SAndroid Build Coastguard Worker %rem20.i = urem i32 %conv18.i, 179 689*9880d681SAndroid Build Coastguard Worker %add.i = or i32 %rem20.i, 131072 690*9880d681SAndroid Build Coastguard Worker store i32 %add.i, i32* @stride, align 4 691*9880d681SAndroid Build Coastguard Worker %8 = load i32*, i32** @ht, align 8 692*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %8, i64 %rem.i 693*9880d681SAndroid Build Coastguard Worker %9 = load i32, i32* %arrayidx, align 4 694*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp eq i32 %9, %conv18.i 695*9880d681SAndroid Build Coastguard Worker br i1 %cmp1, label %if.then, label %if.end 696*9880d681SAndroid Build Coastguard Worker 697*9880d681SAndroid Build Coastguard Workerif.then: 698*9880d681SAndroid Build Coastguard Worker %idxprom.lcssa = phi i64 [ %rem.i, %hash.exit ], [ %idxprom.1, %if.end ], [ %idxprom.2, %if.end.1 ], [ %idxprom.3, %if.end.2 ], [ %idxprom.4, %if.end.3 ], [ %idxprom.5, %if.end.4 ], [ %idxprom.6, %if.end.5 ], [ %idxprom.7, %if.end.6 ] 699*9880d681SAndroid Build Coastguard Worker %10 = load i8*, i8** @he, align 8 700*9880d681SAndroid Build Coastguard Worker %arrayidx3 = getelementptr inbounds i8, i8* %10, i64 %idxprom.lcssa 701*9880d681SAndroid Build Coastguard Worker %11 = load i8, i8* %arrayidx3, align 1 702*9880d681SAndroid Build Coastguard Worker %conv = sext i8 %11 to i32 703*9880d681SAndroid Build Coastguard Worker br label %cleanup 704*9880d681SAndroid Build Coastguard Worker 705*9880d681SAndroid Build Coastguard Workerif.end: 706*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %add.i, %conv19.i 707*9880d681SAndroid Build Coastguard Worker %cmp4 = icmp sgt i32 %add, 1050010 708*9880d681SAndroid Build Coastguard Worker %sub = add nsw i32 %add, -1050011 709*9880d681SAndroid Build Coastguard Worker %sub.add = select i1 %cmp4, i32 %sub, i32 %add 710*9880d681SAndroid Build Coastguard Worker %idxprom.1 = sext i32 %sub.add to i64 711*9880d681SAndroid Build Coastguard Worker %arrayidx.1 = getelementptr inbounds i32, i32* %8, i64 %idxprom.1 712*9880d681SAndroid Build Coastguard Worker %12 = load i32, i32* %arrayidx.1, align 4 713*9880d681SAndroid Build Coastguard Worker %cmp1.1 = icmp eq i32 %12, %conv18.i 714*9880d681SAndroid Build Coastguard Worker br i1 %cmp1.1, label %if.then, label %if.end.1 715*9880d681SAndroid Build Coastguard Worker 716*9880d681SAndroid Build Coastguard Workercleanup: 717*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %conv, %if.then ], [ -128, %if.end.6 ] 718*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 719*9880d681SAndroid Build Coastguard Worker 720*9880d681SAndroid Build Coastguard Workerif.end.1: 721*9880d681SAndroid Build Coastguard Worker %add.1 = add nsw i32 %add.i, %sub.add 722*9880d681SAndroid Build Coastguard Worker %cmp4.1 = icmp sgt i32 %add.1, 1050010 723*9880d681SAndroid Build Coastguard Worker %sub.1 = add nsw i32 %add.1, -1050011 724*9880d681SAndroid Build Coastguard Worker %sub.add.1 = select i1 %cmp4.1, i32 %sub.1, i32 %add.1 725*9880d681SAndroid Build Coastguard Worker %idxprom.2 = sext i32 %sub.add.1 to i64 726*9880d681SAndroid Build Coastguard Worker %arrayidx.2 = getelementptr inbounds i32, i32* %8, i64 %idxprom.2 727*9880d681SAndroid Build Coastguard Worker %13 = load i32, i32* %arrayidx.2, align 4 728*9880d681SAndroid Build Coastguard Worker %cmp1.2 = icmp eq i32 %13, %conv18.i 729*9880d681SAndroid Build Coastguard Worker br i1 %cmp1.2, label %if.then, label %if.end.2 730*9880d681SAndroid Build Coastguard Worker 731*9880d681SAndroid Build Coastguard Workerif.end.2: 732*9880d681SAndroid Build Coastguard Worker %add.2 = add nsw i32 %add.i, %sub.add.1 733*9880d681SAndroid Build Coastguard Worker %cmp4.2 = icmp sgt i32 %add.2, 1050010 734*9880d681SAndroid Build Coastguard Worker %sub.2 = add nsw i32 %add.2, -1050011 735*9880d681SAndroid Build Coastguard Worker %sub.add.2 = select i1 %cmp4.2, i32 %sub.2, i32 %add.2 736*9880d681SAndroid Build Coastguard Worker %idxprom.3 = sext i32 %sub.add.2 to i64 737*9880d681SAndroid Build Coastguard Worker %arrayidx.3 = getelementptr inbounds i32, i32* %8, i64 %idxprom.3 738*9880d681SAndroid Build Coastguard Worker %14 = load i32, i32* %arrayidx.3, align 4 739*9880d681SAndroid Build Coastguard Worker %cmp1.3 = icmp eq i32 %14, %conv18.i 740*9880d681SAndroid Build Coastguard Worker br i1 %cmp1.3, label %if.then, label %if.end.3 741*9880d681SAndroid Build Coastguard Worker 742*9880d681SAndroid Build Coastguard Workerif.end.3: 743*9880d681SAndroid Build Coastguard Worker %add.3 = add nsw i32 %add.i, %sub.add.2 744*9880d681SAndroid Build Coastguard Worker %cmp4.3 = icmp sgt i32 %add.3, 1050010 745*9880d681SAndroid Build Coastguard Worker %sub.3 = add nsw i32 %add.3, -1050011 746*9880d681SAndroid Build Coastguard Worker %sub.add.3 = select i1 %cmp4.3, i32 %sub.3, i32 %add.3 747*9880d681SAndroid Build Coastguard Worker %idxprom.4 = sext i32 %sub.add.3 to i64 748*9880d681SAndroid Build Coastguard Worker %arrayidx.4 = getelementptr inbounds i32, i32* %8, i64 %idxprom.4 749*9880d681SAndroid Build Coastguard Worker %15 = load i32, i32* %arrayidx.4, align 4 750*9880d681SAndroid Build Coastguard Worker %cmp1.4 = icmp eq i32 %15, %conv18.i 751*9880d681SAndroid Build Coastguard Worker br i1 %cmp1.4, label %if.then, label %if.end.4 752*9880d681SAndroid Build Coastguard Worker 753*9880d681SAndroid Build Coastguard Workerif.end.4: 754*9880d681SAndroid Build Coastguard Worker %add.4 = add nsw i32 %add.i, %sub.add.3 755*9880d681SAndroid Build Coastguard Worker %cmp4.4 = icmp sgt i32 %add.4, 1050010 756*9880d681SAndroid Build Coastguard Worker %sub.4 = add nsw i32 %add.4, -1050011 757*9880d681SAndroid Build Coastguard Worker %sub.add.4 = select i1 %cmp4.4, i32 %sub.4, i32 %add.4 758*9880d681SAndroid Build Coastguard Worker %idxprom.5 = sext i32 %sub.add.4 to i64 759*9880d681SAndroid Build Coastguard Worker %arrayidx.5 = getelementptr inbounds i32, i32* %8, i64 %idxprom.5 760*9880d681SAndroid Build Coastguard Worker %16 = load i32, i32* %arrayidx.5, align 4 761*9880d681SAndroid Build Coastguard Worker %cmp1.5 = icmp eq i32 %16, %conv18.i 762*9880d681SAndroid Build Coastguard Worker br i1 %cmp1.5, label %if.then, label %if.end.5 763*9880d681SAndroid Build Coastguard Worker 764*9880d681SAndroid Build Coastguard Workerif.end.5: 765*9880d681SAndroid Build Coastguard Worker %add.5 = add nsw i32 %add.i, %sub.add.4 766*9880d681SAndroid Build Coastguard Worker %cmp4.5 = icmp sgt i32 %add.5, 1050010 767*9880d681SAndroid Build Coastguard Worker %sub.5 = add nsw i32 %add.5, -1050011 768*9880d681SAndroid Build Coastguard Worker %sub.add.5 = select i1 %cmp4.5, i32 %sub.5, i32 %add.5 769*9880d681SAndroid Build Coastguard Worker %idxprom.6 = sext i32 %sub.add.5 to i64 770*9880d681SAndroid Build Coastguard Worker %arrayidx.6 = getelementptr inbounds i32, i32* %8, i64 %idxprom.6 771*9880d681SAndroid Build Coastguard Worker %17 = load i32, i32* %arrayidx.6, align 4 772*9880d681SAndroid Build Coastguard Worker %cmp1.6 = icmp eq i32 %17, %conv18.i 773*9880d681SAndroid Build Coastguard Worker br i1 %cmp1.6, label %if.then, label %if.end.6 774*9880d681SAndroid Build Coastguard Worker 775*9880d681SAndroid Build Coastguard Workerif.end.6: 776*9880d681SAndroid Build Coastguard Worker %add.6 = add nsw i32 %add.i, %sub.add.5 777*9880d681SAndroid Build Coastguard Worker %cmp4.6 = icmp sgt i32 %add.6, 1050010 778*9880d681SAndroid Build Coastguard Worker %sub.6 = add nsw i32 %add.6, -1050011 779*9880d681SAndroid Build Coastguard Worker %sub.add.6 = select i1 %cmp4.6, i32 %sub.6, i32 %add.6 780*9880d681SAndroid Build Coastguard Worker %idxprom.7 = sext i32 %sub.add.6 to i64 781*9880d681SAndroid Build Coastguard Worker %arrayidx.7 = getelementptr inbounds i32, i32* %8, i64 %idxprom.7 782*9880d681SAndroid Build Coastguard Worker %18 = load i32, i32* %arrayidx.7, align 4 783*9880d681SAndroid Build Coastguard Worker %cmp1.7 = icmp eq i32 %18, %conv18.i 784*9880d681SAndroid Build Coastguard Worker br i1 %cmp1.7, label %if.then, label %cleanup 785*9880d681SAndroid Build Coastguard Worker} 786