1; XFAIL: * 2target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64" 3target triple = "powerpc64-unknown-linux-gnu" 4; RUN: llc -verify-machineinstrs -O2 -ppc-asm-full-reg-names -mcpu=pwr7 -ppc-gen-isel=false < %s | FileCheck %s --implicit-check-not isel 5; Function Attrs: norecurse nounwind readnone 6define signext i32 @testExpandISELToIfElse(i32 signext %i, i32 signext %j) { 7entry: 8 %cmp = icmp sgt i32 %i, 0 9 %add = add nsw i32 %i, 1 10 %cond = select i1 %cmp, i32 %add, i32 %j 11 ret i32 %cond 12 13; CHECK-LABEL: @testExpandISELToIfElse 14; CHECK: addi r5, r3, 1 15; CHECK-NEXT: cmpwi cr0, r3, 0 16; CHECK-NEXT: bc 12, gt, [[TRUE:.LBB[0-9]+]] 17; CHECK: ori r3, r4, 0 18; CHECK-NEXT: b [[SUCCESSOR:.LBB[0-9]+]] 19; CHECK-NEXT: [[TRUE]] 20; CHECK-NEXT: addi r3, r5, 0 21; CHECK-NEXT: [[SUCCESSOR]] 22; CHECK-NEXT: extsw r3, r3 23; CHECK-NEXT: blr 24} 25 26 27; Function Attrs: norecurse nounwind readnone 28define signext i32 @testExpandISELToIf(i32 signext %i, i32 signext %j) { 29entry: 30 %cmp = icmp sgt i32 %i, 0 31 %cond = select i1 %cmp, i32 %j, i32 %i 32 ret i32 %cond 33 34; CHECK-LABEL: @testExpandISELToIf 35; CHECK: cmpwi r3, 0 36; CHECK-NEXT: bc 12, gt, [[TRUE:.LBB[0-9]+]] 37; CHECK-NEXT: blr 38; CHECK-NEXT: [[TRUE]] 39; CHECK-NEXT: addi r3, r4, 0 40; CHECK-NEXT: blr 41} 42 43; Function Attrs: norecurse nounwind readnone 44define signext i32 @testExpandISELToElse(i32 signext %i, i32 signext %j) { 45entry: 46 %cmp = icmp sgt i32 %i, 0 47 %cond = select i1 %cmp, i32 %i, i32 %j 48 ret i32 %cond 49 50; CHECK-LABEL: @testExpandISELToElse 51; CHECK: cmpwi r3, 0 52; CHECK-NEXT: bclr 12, gt, 0 53; CHECK: ori r3, r4, 0 54; CHECK-NEXT: blr 55} 56 57; Function Attrs: norecurse nounwind readnone 58define signext i32 @testReplaceISELWithCopy(i32 signext %i, i32 signext %j) { 59entry: 60 %cmp = icmp sgt i32 %i, 0 61 %cond = select i1 %cmp, i32 %j, i32 %j 62 ret i32 %cond 63 64; CHECK-LABEL: @testReplaceISELWithCopy 65 66; Fix me should really check: addi r3, r4, 0 67; but for some reason it's optimized to mr r3, r4 68; CHECK: mr r3, r4 69; CHECK-NEXT: blr 70} 71 72; Function Attrs: norecurse nounwind readnone 73define signext i32 @testExpandISELToNull(i32 signext %i, i32 signext %j) { 74entry: 75 %cmp = icmp sgt i32 %i, 0 76 %cond = select i1 %cmp, i32 %i, i32 %i 77 ret i32 %cond 78 79; CHECK-LABEL: @testExpandISELToNull 80; CHECK-NOT: b {{.LBB[0-9]+}} 81; CHECK-NOT: bc 82; CHECK: blr 83} 84 85; Function Attrs: norecurse nounwind readnone 86define signext i32 @testExpandISELsTo2ORIs2ADDIs 87 (i32 signext %a, i32 signext %b, i32 signext %d, 88 i32 signext %f, i32 signext %g) { 89entry: 90 91 %cmp = icmp sgt i32 %g, 0 92 %a.b = select i1 %cmp, i32 %g, i32 %b 93 %d.f = select i1 %cmp, i32 %d, i32 %f 94 %add = add nsw i32 %a.b, %d.f 95 ret i32 %add 96 97; CHECK-LABEL: @testExpandISELsTo2ORIs2ADDIs 98; CHECK: cmpwi r7, 0 99; CHECK-NEXT: bc 12, gt, [[TRUE:.LBB[0-9]+]] 100; CHECK: ori r3, r4, 0 101; CHECK-NEXT: ori r12, r6, 0 102; CHECK-NEXT: b [[SUCCESSOR:.LBB[0-9]+]] 103; CHECK-NEXT: [[TRUE]] 104; CHECK-NEXT: addi r3, r7, 0 105; CHECK-NEXT: addi r12, r5, 0 106; CHECK-NEXT: [[SUCCESSOR]] 107; CHECK-NEXT: add r3, r3, r12 108; CHECK-NEXT: extsw r3, r3 109; CHECK-NEXT: blr 110} 111 112; Function Attrs: norecurse nounwind readnone 113define signext i32 @testExpandISELsTo2ORIs1ADDI 114 (i32 signext %a, i32 signext %b, i32 signext %d, 115 i32 signext %f, i32 signext %g) { 116entry: 117 %cmp = icmp sgt i32 %g, 0 118 %a.b = select i1 %cmp, i32 %a, i32 %b 119 %d.f = select i1 %cmp, i32 %d, i32 %f 120 %add = add nsw i32 %a.b, %d.f 121 ret i32 %add 122 123; CHECK-LABEL: @testExpandISELsTo2ORIs1ADDI 124; CHECK: cmpwi cr0, r7, 0 125; CHECK-NEXT: bc 12, gt, [[TRUE:.LBB[0-9]+]] 126; CHECK: ori r3, r4, 0 127; CHECK-NEXT: ori r12, r6, 0 128; CHECK-NEXT: b [[SUCCESSOR:.LBB[0-9]+]] 129; CHECK-NEXT: [[TRUE]] 130; CHECK-NEXT: addi r12, r5, 0 131; CHECK-NEXT: [[SUCCESSOR]] 132; CHECK-NEXT: add r3, r3, r12 133; CHECK-NEXT: extsw r3, r3 134; CHECK-NEXT: blr 135} 136 137; Function Attrs: norecurse nounwind readnone 138define signext i32 @testExpandISELsTo1ORI1ADDI 139 (i32 signext %a, i32 signext %b, i32 signext %d, 140 i32 signext %f, i32 signext %g) { 141entry: 142 143 %cmp = icmp sgt i32 %g, 0 144 %a.b = select i1 %cmp, i32 %a, i32 %b 145 %d.f = select i1 %cmp, i32 %d, i32 %f 146 %add1 = add nsw i32 %a.b, %d.f 147 %add2 = add nsw i32 %a, %add1 148 ret i32 %add2 149 150; CHECK-LABEL: @testExpandISELsTo1ORI1ADDI 151; CHECK: cmpwi cr0, r7, 0 152; CHECK-NEXT: bc 12, gt, [[TRUE:.LBB[0-9]+]] 153; CHECK: ori r5, r6, 0 154; CHECK-NEXT: b [[SUCCESSOR:.LBB[0-9]+]] 155; CHECK-NEXT: [[TRUE]] 156; CHECK-NEXT: addi r4, r3, 0 157; CHECK-NEXT: [[SUCCESSOR]] 158; CHECK-NEXT: add r4, r4, r5 159; CHECK-NEXT: add r3, r3, r4 160; CHECK-NEXT: extsw r3, r3 161; CHECK-NEXT: blr 162} 163 164; Function Attrs: norecurse nounwind readnone 165define signext i32 @testExpandISELsTo0ORI2ADDIs 166 (i32 signext %a, i32 signext %b, i32 signext %d, 167 i32 signext %f, i32 signext %g) { 168entry: 169 170 %cmp = icmp sgt i32 %g, 0 171 %a.b = select i1 %cmp, i32 %a, i32 %b 172 %d.f = select i1 %cmp, i32 %d, i32 %f 173 %add1 = add nsw i32 %a.b, %d.f 174 %add2 = add nsw i32 %a, %add1 175 %sub1 = sub nsw i32 %add2, %d 176 ret i32 %sub1 177 178; CHECK-LABEL: @testExpandISELsTo0ORI2ADDIs 179; CHECK: cmpwi cr0, r7, 0 180; CHECK-NEXT: bc 12, gt, [[TRUE:.LBB[0-9]+]] 181; CHECK-NEXT: b [[SUCCESSOR:.LBB[0-9]+]] 182; CHECK-NEXT: [[TRUE]] 183; CHECK-NEXT: addi r4, r3, 0 184; CHECK-NEXT: addi r6, r5, 0 185; CHECK-NEXT: [[SUCCESSOR]] 186; CHECK-NEXT: add r4, r4, r6 187; CHECK-NEXT: add r3, r3, r4 188; CHECK-NEXT: subf r3, r5, r3 189; CHECK-NEXT: extsw r3, r3 190; CHECK-NEXT: blr 191} 192 193 194@b = common local_unnamed_addr global i32 0, align 4 195@a = common local_unnamed_addr global i32 0, align 4 196; Function Attrs: norecurse nounwind readonly 197define signext i32 @testComplexISEL() #0 { 198entry: 199 %0 = load i32, i32* @b, align 4, !tbaa !1 200 %tobool = icmp eq i32 %0, 0 201 br i1 %tobool, label %if.end, label %cleanup 202 203if.end: 204 %1 = load i32, i32* @a, align 4, !tbaa !1 205 %conv = sext i32 %1 to i64 206 %2 = inttoptr i64 %conv to i32 (...)* 207 %cmp = icmp eq i32 (...)* %2, bitcast (i32 ()* @testComplexISEL to i32 (...)*) 208 %conv3 = zext i1 %cmp to i32 209 br label %cleanup 210 211cleanup: 212 %retval.0 = phi i32 [ %conv3, %if.end ], [ 1, %entry ] 213 ret i32 %retval.0 214 215; CHECK-LABEL: @testComplexISEL 216; CHECK-DAG: [[LI:r[0-9]+]], 1 217; CHECK-DAG: cmplwi [[LD:r[0-9]+]], 0 218; CHECK: bnelr cr0 219; CHECK: xor [[XOR:r[0-9]+]] 220; CHECK: cntlzd [[CZ:r[0-9]+]], [[XOR]] 221; CHECK: rldicl [[SH:r[0-9]+]], [[CZ]], 58, 63 222} 223 224!1 = !{!2, !2, i64 0} 225!2 = !{!"int", !3, i64 0} 226!3 = !{!"omnipotent char", !4, i64 0} 227!4 = !{!"Simple C/C++ TBAA"} 228