Home | History | Annotate | Download | only in PowerPC
      1 ; XFAIL: *
      2 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      3 ; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -O2 \
      4 ; RUN:   -ppc-asm-full-reg-names -mcpu=pwr8 < %s | FileCheck %s \
      5 ; RUN:  --implicit-check-not cmpw --implicit-check-not cmpd --implicit-check-not cmpl
      6 ; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -O2 \
      7 ; RUN:   -ppc-asm-full-reg-names -mcpu=pwr8 < %s | FileCheck %s \
      8 ; RUN:  --implicit-check-not cmpw --implicit-check-not cmpd --implicit-check-not cmpl
      9 
     10 ; Function Attrs: nounwind
     11 define signext i32 @logic_ne_32(i32 signext %a, i32 signext %b, i32 signext %c) {
     12 ; CHECK-LABEL: logic_ne_32:
     13 ; CHECK:    xor r7, r3, r4
     14 ; CHECK-NEXT:    li r6, 55
     15 ; CHECK-NEXT:    xor r5, r5, r6
     16 ; CHECK-NEXT:    or r7, r7, r4
     17 ; CHECK-NEXT:    cntlzw r5, r5
     18 ; CHECK-NEXT:    cntlzw r6, r7
     19 ; CHECK-NEXT:    srwi r6, r6, 5
     20 ; CHECK-NEXT:    srwi r5, r5, 5
     21 ; CHECK-NEXT:    or. r5, r6, r5
     22 ; CHECK-NEXT:    bc 4, gt
     23 entry:
     24   %tobool = icmp eq i32 %a, %b
     25   %tobool1 = icmp eq i32 %b, 0
     26   %or.cond = and i1 %tobool, %tobool1
     27   %tobool3 = icmp eq i32 %c, 55
     28   %or.cond5 = or i1 %or.cond, %tobool3
     29   br i1 %or.cond5, label %if.end, label %if.then
     30 
     31 if.then:                                          ; preds = %entry
     32   %call = tail call signext i32 @foo(i32 signext %a) #2
     33   br label %return
     34 
     35 if.end:                                           ; preds = %entry
     36   %call4 = tail call signext i32 @bar(i32 signext %b) #2
     37   br label %return
     38 
     39 return:                                           ; preds = %if.end, %if.then
     40   %retval.0 = phi i32 [ %call4, %if.end ], [ %call, %if.then ]
     41   ret i32 %retval.0
     42 }
     43 
     44 define void @neg_truncate_i32_eq(i32 *%ptr) {
     45 ; CHECK-LABEL: neg_truncate_i32_eq:
     46 ; CHECK:       # %bb.0: # %entry
     47 ; CHECK-NEXT:    lwz r3, 0(r3)
     48 ; CHECK-NEXT:    rldicl. r3, r3, 0, 63
     49 ; CHECK-NEXT:    bclr 12, eq, 0
     50 ; CHECK-NEXT:  # %bb.1: # %if.end29.thread136
     51 entry:
     52   %0 = load i32, i32* %ptr, align 4
     53   %rem17127 = and i32 %0, 1
     54   %cmp18 = icmp eq i32 %rem17127, 0
     55   br label %if.else
     56 
     57 if.else:                                          ; preds = %entry
     58   br i1 %cmp18, label %if.end29, label %if.end29.thread136
     59 
     60 if.end29.thread136:                               ; preds = %if.else
     61   unreachable
     62 
     63 if.end29:                                         ; preds = %if.else
     64   ret void
     65 
     66 }
     67 
     68 ; Function Attrs: nounwind
     69 define i64 @logic_eq_64(i64 %a, i64 %b, i64 %c) {
     70 ; CHECK-LABEL: logic_eq_64:
     71 ; CHECK:    xor r7, r3, r4
     72 ; CHECK-NEXT:    li r6, 55
     73 ; CHECK-NEXT:    xor r5, r5, r6
     74 ; CHECK-NEXT:    or r7, r7, r4
     75 ; CHECK-NEXT:    cntlzd r6, r7
     76 ; CHECK-NEXT:    cntlzd r5, r5
     77 ; CHECK-NEXT:    rldicl r6, r6, 58, 63
     78 ; CHECK-NEXT:    rldicl r5, r5, 58, 63
     79 ; CHECK-NEXT:    or. r5, r6, r5
     80 ; CHECK-NEXT:    bc 4, gt
     81 entry:
     82   %tobool = icmp eq i64 %a, %b
     83   %tobool1 = icmp eq i64 %b, 0
     84   %or.cond = and i1 %tobool, %tobool1
     85   %tobool3 = icmp eq i64 %c, 55
     86   %or.cond5 = or i1 %or.cond, %tobool3
     87   br i1 %or.cond5, label %if.end, label %if.then
     88 
     89 if.then:                                          ; preds = %entry
     90   %call = tail call i64 @foo64(i64 %a) #2
     91   br label %return
     92 
     93 if.end:                                           ; preds = %entry
     94   %call4 = tail call i64 @bar64(i64 %b) #2
     95   br label %return
     96 
     97 return:                                           ; preds = %if.end, %if.then
     98   %retval.0 = phi i64 [ %call4, %if.end ], [ %call, %if.then ]
     99   ret i64 %retval.0
    100 }
    101 
    102 define void @neg_truncate_i64_eq(i64 *%ptr) {
    103 ; CHECK-LABEL: neg_truncate_i64_eq:
    104 ; CHECK:       # %bb.0: # %entry
    105 ; CHECK-NEXT:    ld r3, 0(r3)
    106 ; CHECK-NEXT:    rldicl. r3, r3, 0, 63
    107 ; CHECK-NEXT:    bclr 12, eq, 0
    108 ; CHECK-NEXT:  # %bb.1: # %if.end29.thread136
    109 entry:
    110   %0 = load i64, i64* %ptr, align 4
    111   %rem17127 = and i64 %0, 1
    112   %cmp18 = icmp eq i64 %rem17127, 0
    113   br label %if.else
    114 
    115 if.else:                                          ; preds = %entry
    116   br i1 %cmp18, label %if.end29, label %if.end29.thread136
    117 
    118 if.end29.thread136:                               ; preds = %if.else
    119   unreachable
    120 
    121 if.end29:                                         ; preds = %if.else
    122   ret void
    123 
    124 }
    125 
    126 ; Function Attrs: nounwind
    127 define i64 @logic_ne_64(i64 %a, i64 %b, i64 %c) {
    128 ; CHECK-LABEL: logic_ne_64:
    129 ; CHECK:    xor r7, r3, r4
    130 ; CHECK-NEXT:    li r6, 55
    131 ; CHECK-NEXT:    addic r8, r7, -1
    132 ; CHECK-NEXT:    xor r5, r5, r6
    133 ; CHECK-NEXT:    subfe r7, r8, r7
    134 ; CHECK-NEXT:    cntlzd r5, r5
    135 ; CHECK-NEXT:    addic r12, r4, -1
    136 ; CHECK-NEXT:    rldicl r5, r5, 58, 63
    137 ; CHECK-NEXT:    subfe r6, r12, r4
    138 ; CHECK-NEXT:    and r6, r7, r6
    139 ; CHECK-NEXT:    or. r5, r6, r5
    140 ; CHECK-NEXT:    bc 4, gt
    141 entry:
    142   %tobool = icmp ne i64 %a, %b
    143   %tobool1 = icmp ne i64 %b, 0
    144   %or.cond = and i1 %tobool, %tobool1
    145   %tobool3 = icmp eq i64 %c, 55
    146   %or.cond5 = or i1 %or.cond, %tobool3
    147   br i1 %or.cond5, label %if.end, label %if.then
    148 
    149 if.then:                                          ; preds = %entry
    150   %call = tail call i64 @foo64(i64 %a) #2
    151   br label %return
    152 
    153 if.end:                                           ; preds = %entry
    154   %call4 = tail call i64 @bar64(i64 %b) #2
    155   br label %return
    156 
    157 return:                                           ; preds = %if.end, %if.then
    158   %retval.0 = phi i64 [ %call4, %if.end ], [ %call, %if.then ]
    159   ret i64 %retval.0
    160 }
    161 
    162 define void @neg_truncate_i64_ne(i64 *%ptr) {
    163 ; CHECK-LABEL: neg_truncate_i64_ne:
    164 ; CHECK:       # %bb.0: # %entry
    165 ; CHECK-NEXT:    ld r3, 0(r3)
    166 ; CHECK-NEXT:    andi. r3, r3, 1
    167 ; CHECK-NEXT:    bclr 12, gt, 0
    168 ; CHECK-NEXT:  # %bb.1: # %if.end29.thread136
    169 entry:
    170   %0 = load i64, i64* %ptr, align 4
    171   %rem17127 = and i64 %0, 1
    172   %cmp18 = icmp ne i64 %rem17127, 0
    173   br label %if.else
    174 
    175 if.else:                                          ; preds = %entry
    176   br i1 %cmp18, label %if.end29, label %if.end29.thread136
    177 
    178 if.end29.thread136:                               ; preds = %if.else
    179   unreachable
    180 
    181 if.end29:                                         ; preds = %if.else
    182   ret void
    183 
    184 }
    185 
    186 declare signext i32 @foo(i32 signext)
    187 declare signext i32 @bar(i32 signext)
    188 declare i64 @foo64(i64)
    189 declare i64 @bar64(i64)
    190