1 ; Test traps and conditional traps 2 ; 3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4 5 declare void @llvm.trap() 6 7 ; Check unconditional traps 8 define i32 @f0() { 9 ; CHECK-LABEL: f0: 10 ; CHECK-LABEL: .Ltmp0 11 ; CHECK: j .Ltmp0+2 12 entry: 13 tail call void @llvm.trap() 14 ret i32 0 15 } 16 17 ; Check conditional compare immediate and trap 18 define i32 @f1(i32 signext %a) { 19 ; CHECK-LABEL: f1: 20 ; CHECK: cithe %r2, 15 21 ; CHECK: lhi %r2, 0 22 ; CHECK: br %r14 23 entry: 24 %cmp = icmp sgt i32 %a, 14 25 br i1 %cmp, label %if.then, label %if.end 26 27 if.then: ; preds = %entry 28 tail call void @llvm.trap() 29 unreachable 30 31 if.end: ; preds = %entry 32 ret i32 0 33 } 34 35 ; Check conditional compare grande immediate and trap 36 define i64 @f2(i64 signext %a) { 37 ; CHECK-LABEL: f2: 38 ; CHECK: cgitle %r2, 14 39 ; CHECK: lghi %r2, 0 40 ; CHECK: br %r14 41 entry: 42 %cmp = icmp slt i64 %a, 15 43 br i1 %cmp, label %if.then, label %if.end 44 45 if.then: ; preds = %entry 46 tail call void @llvm.trap() 47 unreachable 48 49 if.end: ; preds = %entry 50 ret i64 0 51 } 52 53 ; Check conditional compare logical immediate and trap 54 define i32 @f3(i32 zeroext %a) { 55 ; CHECK-LABEL: f3: 56 ; CHECK: clfithe %r2, 15 57 ; CHECK: lhi %r2, 0 58 ; CHECK: br %r14 59 entry: 60 %cmp = icmp ugt i32 %a, 14 61 br i1 %cmp, label %if.then, label %if.end 62 63 if.then: ; preds = %entry 64 tail call void @llvm.trap() 65 unreachable 66 67 if.end: ; preds = %entry 68 ret i32 0 69 } 70 71 ; Check conditional compare grande logical immediate and trap 72 define i64 @f4(i64 zeroext %a) { 73 ; CHECK-LABEL: f4: 74 ; CHECK: clgitle %r2, 14 75 ; CHECK: lghi %r2, 0 76 ; CHECK: br %r14 77 entry: 78 %cmp = icmp ult i64 %a, 15 79 br i1 %cmp, label %if.then, label %if.end 80 81 if.then: ; preds = %entry 82 tail call void @llvm.trap() 83 unreachable 84 85 if.end: ; preds = %entry 86 ret i64 0 87 } 88 89 ; Check conditional compare and trap 90 define i32 @f5(i32 signext %a, i32 signext %b) { 91 ; CHECK-LABEL: f5: 92 ; CHECK: crte %r2, %r3 93 ; CHECK: lhi %r2, 0 94 ; CHECK: br %r14 95 entry: 96 %cmp = icmp eq i32 %a, %b 97 br i1 %cmp, label %if.then, label %if.end 98 99 if.then: ; preds = %entry 100 tail call void @llvm.trap() 101 unreachable 102 103 if.end: ; preds = %entry 104 ret i32 0 105 } 106 107 ; Check conditional compare grande and trap 108 define i64 @f6(i64 signext %a, i64 signext %b) { 109 ; CHECK-LABEL: f6: 110 ; CHECK: cgrtl %r2, %r3 111 ; CHECK: lghi %r2, 0 112 ; CHECK: br %r14 113 entry: 114 %cmp = icmp slt i64 %a, %b 115 br i1 %cmp, label %if.then, label %if.end 116 117 if.then: ; preds = %entry 118 tail call void @llvm.trap() 119 unreachable 120 121 if.end: ; preds = %entry 122 ret i64 0 123 } 124 125 ; Check conditional compare logical and trap 126 define i32 @f7(i32 zeroext %a, i32 zeroext %b) { 127 ; CHECK-LABEL: f7: 128 ; CHECK: clrth %r2, %r3 129 ; CHECK: lhi %r2, 0 130 ; CHECK: br %r14 131 entry: 132 %cmp = icmp ugt i32 %a, %b 133 br i1 %cmp, label %if.then, label %if.end 134 135 if.then: ; preds = %entry 136 tail call void @llvm.trap() 137 unreachable 138 139 if.end: ; preds = %entry 140 ret i32 0 141 } 142 143 ; Check conditional compare logical grande and trap 144 define i64 @f8(i64 zeroext %a, i64 zeroext %b) { 145 ; CHECK-LABEL: f8: 146 ; CHECK: clgrtl %r2, %r3 147 ; CHECK: lghi %r2, 0 148 ; CHECK: br %r14 149 entry: 150 %cmp = icmp ult i64 %a, %b 151 br i1 %cmp, label %if.then, label %if.end 152 153 if.then: ; preds = %entry 154 tail call void @llvm.trap() 155 unreachable 156 157 if.end: ; preds = %entry 158 ret i64 0 159 } 160 161 ; Check conditional traps that don't have a valid Compare and Trap 162 define double @f9(double %a, double %b) { 163 ; CHECK-LABEL: f9: 164 ; CHECK: cdbr %f0, %f2 165 ; CHECK-LABEL: .Ltmp1 166 ; CHECK: je .Ltmp1+2 167 ; CHECK: lzdr %f0 168 ; CHECK: br %r14 169 entry: 170 %cmp = fcmp oeq double %a, %b 171 br i1 %cmp, label %if.then, label %if.end 172 173 if.then: ; preds = %entry 174 tail call void @llvm.trap() 175 unreachable 176 177 if.end: ; preds = %entry 178 ret double 0.000000e+00 179 } 180