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