Home | History | Annotate | Download | only in AMDGPU
      1 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
      2 
      3 ; GCN-LABEL: {{^}}setcc_sgt_true_sext:
      4 ; GCN:      v_cmp_le_u32_e{{32|64}} [[CC:[^,]+]], v{{[0-9]+}}, v{{[0-9]+}}
      5 ; GCN-NEXT: s_and_saveexec_b64 {{[^,]+}}, [[CC]]
      6 ; GCN-NOT:  v_cndmask_
      7 
      8 define amdgpu_kernel void @setcc_sgt_true_sext(i32 addrspace(1)* nocapture %arg) {
      9 bb:
     10   %x = tail call i32 @llvm.amdgcn.workitem.id.x()
     11   %y = tail call i32 @llvm.amdgcn.workitem.id.y()
     12   %cmp = icmp ugt i32 %x, %y
     13   %ext = sext i1 %cmp to i32
     14   %cond = icmp sgt i32 %ext, -1
     15   br i1 %cond, label %then, label %endif
     16 
     17 then:
     18   store i32 1, i32 addrspace(1)* %arg, align 4
     19   br label %endif
     20 
     21 endif:
     22   ret void
     23 }
     24 
     25 ; GCN-LABEL: {{^}}setcc_sgt_true_sext_swap:
     26 ; GCN:      v_cmp_le_u32_e{{32|64}} [[CC:[^,]+]], v{{[0-9]+}}, v{{[0-9]+}}
     27 ; GCN-NEXT: s_and_saveexec_b64 {{[^,]+}}, [[CC]]
     28 ; GCN-NOT:  v_cndmask_
     29 
     30 define amdgpu_kernel void @setcc_sgt_true_sext_swap(i32 addrspace(1)* nocapture %arg) {
     31 bb:
     32   %x = tail call i32 @llvm.amdgcn.workitem.id.x()
     33   %y = tail call i32 @llvm.amdgcn.workitem.id.y()
     34   %cmp = icmp ugt i32 %x, %y
     35   %ext = sext i1 %cmp to i32
     36   %cond = icmp slt i32 -1, %ext
     37   br i1 %cond, label %then, label %endif
     38 
     39 then:
     40   store i32 1, i32 addrspace(1)* %arg, align 4
     41   br label %endif
     42 
     43 endif:
     44   ret void
     45 }
     46 
     47 ; GCN-LABEL: {{^}}setcc_ne_true_sext:
     48 ; GCN:      v_cmp_le_u32_e{{32|64}} [[CC:[^,]+]], v{{[0-9]+}}, v{{[0-9]+}}
     49 ; GCN-NEXT: s_and_saveexec_b64 {{[^,]+}}, [[CC]]
     50 ; GCN-NOT:  v_cndmask_
     51 
     52 define amdgpu_kernel void @setcc_ne_true_sext(i32 addrspace(1)* nocapture %arg) {
     53 bb:
     54   %x = tail call i32 @llvm.amdgcn.workitem.id.x()
     55   %y = tail call i32 @llvm.amdgcn.workitem.id.y()
     56   %cmp = icmp ugt i32 %x, %y
     57   %ext = sext i1 %cmp to i32
     58   %cond = icmp ne i32 %ext, -1
     59   br i1 %cond, label %then, label %endif
     60 
     61 then:
     62   store i32 1, i32 addrspace(1)* %arg, align 4
     63   br label %endif
     64 
     65 endif:
     66   ret void
     67 }
     68 
     69 ; GCN-LABEL: {{^}}setcc_ult_true_sext:
     70 ; GCN:      v_cmp_le_u32_e{{32|64}} [[CC:[^,]+]], v{{[0-9]+}}, v{{[0-9]+}}
     71 ; GCN-NEXT: s_and_saveexec_b64 {{[^,]+}}, [[CC]]
     72 ; GCN-NOT:  v_cndmask_
     73 
     74 define amdgpu_kernel void @setcc_ult_true_sext(i32 addrspace(1)* nocapture %arg) {
     75 bb:
     76   %x = tail call i32 @llvm.amdgcn.workitem.id.x()
     77   %y = tail call i32 @llvm.amdgcn.workitem.id.y()
     78   %cmp = icmp ugt i32 %x, %y
     79   %ext = sext i1 %cmp to i32
     80   %cond = icmp ult i32 %ext, -1
     81   br i1 %cond, label %then, label %endif
     82 
     83 then:
     84   store i32 1, i32 addrspace(1)* %arg, align 4
     85   br label %endif
     86 
     87 endif:
     88   ret void
     89 }
     90 
     91 ; GCN-LABEL: {{^}}setcc_eq_true_sext:
     92 ; GCN:      v_cmp_gt_u32_e{{32|64}} [[CC:[^,]+]], v{{[0-9]+}}, v{{[0-9]+}}
     93 ; GCN-NEXT: s_and_saveexec_b64 {{[^,]+}}, [[CC]]
     94 ; GCN-NOT:  v_cndmask_
     95 
     96 define amdgpu_kernel void @setcc_eq_true_sext(i32 addrspace(1)* nocapture %arg) {
     97 bb:
     98   %x = tail call i32 @llvm.amdgcn.workitem.id.x()
     99   %y = tail call i32 @llvm.amdgcn.workitem.id.y()
    100   %cmp = icmp ugt i32 %x, %y
    101   %ext = sext i1 %cmp to i32
    102   %cond = icmp eq i32 %ext, -1
    103   br i1 %cond, label %then, label %endif
    104 
    105 then:
    106   store i32 1, i32 addrspace(1)* %arg, align 4
    107   br label %endif
    108 
    109 endif:
    110   ret void
    111 }
    112 
    113 ; GCN-LABEL: {{^}}setcc_sle_true_sext:
    114 ; GCN:      v_cmp_gt_u32_e{{32|64}} [[CC:[^,]+]], v{{[0-9]+}}, v{{[0-9]+}}
    115 ; GCN-NEXT: s_and_saveexec_b64 {{[^,]+}}, [[CC]]
    116 ; GCN-NOT:  v_cndmask_
    117 
    118 define amdgpu_kernel void @setcc_sle_true_sext(i32 addrspace(1)* nocapture %arg) {
    119 bb:
    120   %x = tail call i32 @llvm.amdgcn.workitem.id.x()
    121   %y = tail call i32 @llvm.amdgcn.workitem.id.y()
    122   %cmp = icmp ugt i32 %x, %y
    123   %ext = sext i1 %cmp to i32
    124   %cond = icmp sle i32 %ext, -1
    125   br i1 %cond, label %then, label %endif
    126 
    127 then:
    128   store i32 1, i32 addrspace(1)* %arg, align 4
    129   br label %endif
    130 
    131 endif:
    132   ret void
    133 }
    134 
    135 ; GCN-LABEL: {{^}}setcc_uge_true_sext:
    136 ; GCN:      v_cmp_gt_u32_e{{32|64}} [[CC:[^,]+]], v{{[0-9]+}}, v{{[0-9]+}}
    137 ; GCN-NEXT: s_and_saveexec_b64 {{[^,]+}}, [[CC]]
    138 ; GCN-NOT:  v_cndmask_
    139 
    140 define amdgpu_kernel void @setcc_uge_true_sext(i32 addrspace(1)* nocapture %arg) {
    141 bb:
    142   %x = tail call i32 @llvm.amdgcn.workitem.id.x()
    143   %y = tail call i32 @llvm.amdgcn.workitem.id.y()
    144   %cmp = icmp ugt i32 %x, %y
    145   %ext = sext i1 %cmp to i32
    146   %cond = icmp uge i32 %ext, -1
    147   br i1 %cond, label %then, label %endif
    148 
    149 then:
    150   store i32 1, i32 addrspace(1)* %arg, align 4
    151   br label %endif
    152 
    153 endif:
    154   ret void
    155 }
    156 
    157 ; GCN-LABEL: {{^}}setcc_eq_false_sext:
    158 ; GCN:      v_cmp_le_u32_e{{32|64}} [[CC:[^,]+]], v{{[0-9]+}}, v{{[0-9]+}}
    159 ; GCN-NEXT: s_and_saveexec_b64 {{[^,]+}}, [[CC]]
    160 ; GCN-NOT:  v_cndmask_
    161 
    162 define amdgpu_kernel void @setcc_eq_false_sext(i32 addrspace(1)* nocapture %arg) {
    163 bb:
    164   %x = tail call i32 @llvm.amdgcn.workitem.id.x()
    165   %y = tail call i32 @llvm.amdgcn.workitem.id.y()
    166   %cmp = icmp ugt i32 %x, %y
    167   %ext = sext i1 %cmp to i32
    168   %cond = icmp eq i32 %ext, 0
    169   br i1 %cond, label %then, label %endif
    170 
    171 then:
    172   store i32 1, i32 addrspace(1)* %arg, align 4
    173   br label %endif
    174 
    175 endif:
    176   ret void
    177 }
    178 
    179 ; GCN-LABEL: {{^}}setcc_sge_false_sext:
    180 ; GCN:      v_cmp_le_u32_e{{32|64}} [[CC:[^,]+]], v{{[0-9]+}}, v{{[0-9]+}}
    181 ; GCN-NEXT: s_and_saveexec_b64 {{[^,]+}}, [[CC]]
    182 ; GCN-NOT:  v_cndmask_
    183 
    184 define amdgpu_kernel void @setcc_sge_false_sext(i32 addrspace(1)* nocapture %arg) {
    185 bb:
    186   %x = tail call i32 @llvm.amdgcn.workitem.id.x()
    187   %y = tail call i32 @llvm.amdgcn.workitem.id.y()
    188   %cmp = icmp ugt i32 %x, %y
    189   %ext = sext i1 %cmp to i32
    190   %cond = icmp sge i32 %ext, 0
    191   br i1 %cond, label %then, label %endif
    192 
    193 then:
    194   store i32 1, i32 addrspace(1)* %arg, align 4
    195   br label %endif
    196 
    197 endif:
    198   ret void
    199 }
    200 
    201 ; GCN-LABEL: {{^}}setcc_ule_false_sext:
    202 ; GCN:      v_cmp_le_u32_e{{32|64}} [[CC:[^,]+]], v{{[0-9]+}}, v{{[0-9]+}}
    203 ; GCN-NEXT: s_and_saveexec_b64 {{[^,]+}}, [[CC]]
    204 ; GCN-NOT:  v_cndmask_
    205 
    206 define amdgpu_kernel void @setcc_ule_false_sext(i32 addrspace(1)* nocapture %arg) {
    207 bb:
    208   %x = tail call i32 @llvm.amdgcn.workitem.id.x()
    209   %y = tail call i32 @llvm.amdgcn.workitem.id.y()
    210   %cmp = icmp ugt i32 %x, %y
    211   %ext = sext i1 %cmp to i32
    212   %cond = icmp ule i32 %ext, 0
    213   br i1 %cond, label %then, label %endif
    214 
    215 then:
    216   store i32 1, i32 addrspace(1)* %arg, align 4
    217   br label %endif
    218 
    219 endif:
    220   ret void
    221 }
    222 
    223 ; GCN-LABEL: {{^}}setcc_ne_false_sext:
    224 ; GCN:      v_cmp_gt_u32_e{{32|64}} [[CC:[^,]+]], v{{[0-9]+}}, v{{[0-9]+}}
    225 ; GCN-NEXT: s_and_saveexec_b64 {{[^,]+}}, [[CC]]
    226 ; GCN-NOT:  v_cndmask_
    227 
    228 define amdgpu_kernel void @setcc_ne_false_sext(i32 addrspace(1)* nocapture %arg) {
    229 bb:
    230   %x = tail call i32 @llvm.amdgcn.workitem.id.x()
    231   %y = tail call i32 @llvm.amdgcn.workitem.id.y()
    232   %cmp = icmp ugt i32 %x, %y
    233   %ext = sext i1 %cmp to i32
    234   %cond = icmp ne i32 %ext, 0
    235   br i1 %cond, label %then, label %endif
    236 
    237 then:
    238   store i32 1, i32 addrspace(1)* %arg, align 4
    239   br label %endif
    240 
    241 endif:
    242   ret void
    243 }
    244 ; GCN-LABEL: {{^}}setcc_ugt_false_sext:
    245 ; GCN:      v_cmp_gt_u32_e{{32|64}} [[CC:[^,]+]], v{{[0-9]+}}, v{{[0-9]+}}
    246 ; GCN-NEXT: s_and_saveexec_b64 {{[^,]+}}, [[CC]]
    247 ; GCN-NOT:  v_cndmask_
    248 
    249 define amdgpu_kernel void @setcc_ugt_false_sext(i32 addrspace(1)* nocapture %arg) {
    250 bb:
    251   %x = tail call i32 @llvm.amdgcn.workitem.id.x()
    252   %y = tail call i32 @llvm.amdgcn.workitem.id.y()
    253   %cmp = icmp ugt i32 %x, %y
    254   %ext = sext i1 %cmp to i32
    255   %cond = icmp ugt i32 %ext, 0
    256   br i1 %cond, label %then, label %endif
    257 
    258 then:
    259   store i32 1, i32 addrspace(1)* %arg, align 4
    260   br label %endif
    261 
    262 endif:
    263   ret void
    264 }
    265 ; GCN-LABEL: {{^}}setcc_slt_false_sext:
    266 ; GCN:      v_cmp_gt_u32_e{{32|64}} [[CC:[^,]+]], v{{[0-9]+}}, v{{[0-9]+}}
    267 ; GCN-NEXT: s_and_saveexec_b64 {{[^,]+}}, [[CC]]
    268 ; GCN-NOT:  v_cndmask_
    269 
    270 define amdgpu_kernel void @setcc_slt_false_sext(i32 addrspace(1)* nocapture %arg) {
    271 bb:
    272   %x = tail call i32 @llvm.amdgcn.workitem.id.x()
    273   %y = tail call i32 @llvm.amdgcn.workitem.id.y()
    274   %cmp = icmp ugt i32 %x, %y
    275   %ext = sext i1 %cmp to i32
    276   %cond = icmp slt i32 %ext, 0
    277   br i1 %cond, label %then, label %endif
    278 
    279 then:
    280   store i32 1, i32 addrspace(1)* %arg, align 4
    281   br label %endif
    282 
    283 endif:
    284   ret void
    285 }
    286 
    287 
    288 declare i32 @llvm.amdgcn.workitem.id.x() #0
    289 
    290 declare i32 @llvm.amdgcn.workitem.id.y() #0
    291 
    292 attributes #0 = { nounwind readnone speculatable }
    293