1 ; RUN: llc < %s -O0 -fast-isel-abort=1 -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios -verify-machineinstrs | FileCheck %s --check-prefix=ARM 2 ; RUN: llc < %s -O0 -fast-isel-abort=1 -relocation-model=dynamic-no-pic -mtriple=armv7-linux-gnueabi -verify-machineinstrs | FileCheck %s --check-prefix=ARM 3 ; RUN: llc < %s -O0 -fast-isel-abort=1 -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios -verify-machineinstrs | FileCheck %s --check-prefix=THUMB 4 5 define void @t1a(float %a) uwtable ssp { 6 entry: 7 ; ARM: t1a 8 ; THUMB: t1a 9 %cmp = fcmp oeq float %a, 0.000000e+00 10 ; ARM: vcmpe.f32 s{{[0-9]+}}, #0 11 ; THUMB: vcmpe.f32 s{{[0-9]+}}, #0 12 br i1 %cmp, label %if.then, label %if.end 13 14 if.then: ; preds = %entry 15 tail call void @foo() 16 br label %if.end 17 18 if.end: ; preds = %if.then, %entry 19 ret void 20 } 21 22 declare void @foo() 23 24 ; Shouldn't be able to encode -0.0 imm. 25 define void @t1b(float %a) uwtable ssp { 26 entry: 27 ; ARM: t1b 28 ; THUMB: t1b 29 %cmp = fcmp oeq float %a, -0.000000e+00 30 ; ARM: vldr 31 ; ARM: vcmpe.f32 s{{[0-9]+}}, s{{[0-9]+}} 32 ; THUMB: vldr 33 ; THUMB: vcmpe.f32 s{{[0-9]+}}, s{{[0-9]+}} 34 br i1 %cmp, label %if.then, label %if.end 35 36 if.then: ; preds = %entry 37 tail call void @foo() 38 br label %if.end 39 40 if.end: ; preds = %if.then, %entry 41 ret void 42 } 43 44 define void @t2a(double %a) uwtable ssp { 45 entry: 46 ; ARM: t2a 47 ; THUMB: t2a 48 %cmp = fcmp oeq double %a, 0.000000e+00 49 ; ARM: vcmpe.f64 d{{[0-9]+}}, #0 50 ; THUMB: vcmpe.f64 d{{[0-9]+}}, #0 51 br i1 %cmp, label %if.then, label %if.end 52 53 if.then: ; preds = %entry 54 tail call void @foo() 55 br label %if.end 56 57 if.end: ; preds = %if.then, %entry 58 ret void 59 } 60 61 ; Shouldn't be able to encode -0.0 imm. 62 define void @t2b(double %a) uwtable ssp { 63 entry: 64 ; ARM: t2b 65 ; THUMB: t2b 66 %cmp = fcmp oeq double %a, -0.000000e+00 67 ; ARM: vldr 68 ; ARM: vcmpe.f64 d{{[0-9]+}}, d{{[0-9]+}} 69 ; THUMB: vldr 70 ; THUMB: vcmpe.f64 d{{[0-9]+}}, d{{[0-9]+}} 71 br i1 %cmp, label %if.then, label %if.end 72 73 if.then: ; preds = %entry 74 tail call void @foo() 75 br label %if.end 76 77 if.end: ; preds = %if.then, %entry 78 ret void 79 } 80 81 define void @t4(i8 signext %a) uwtable ssp { 82 entry: 83 ; ARM: t4 84 ; THUMB: t4 85 %cmp = icmp eq i8 %a, -1 86 ; ARM: cmn r{{[0-9]}}, #1 87 ; THUMB: cmn.w r{{[0-9]}}, #1 88 br i1 %cmp, label %if.then, label %if.end 89 90 if.then: ; preds = %entry 91 tail call void @foo() 92 br label %if.end 93 94 if.end: ; preds = %if.then, %entry 95 ret void 96 } 97 98 define void @t5(i8 zeroext %a) uwtable ssp { 99 entry: 100 ; ARM: t5 101 ; THUMB: t5 102 %cmp = icmp eq i8 %a, 1 103 ; ARM: cmp r{{[0-9]}}, #1 104 ; THUMB: cmp r{{[0-9]}}, #1 105 br i1 %cmp, label %if.then, label %if.end 106 107 if.then: ; preds = %entry 108 tail call void @foo() 109 br label %if.end 110 111 if.end: ; preds = %if.then, %entry 112 ret void 113 } 114 115 define void @t6(i16 signext %a) uwtable ssp { 116 entry: 117 ; ARM: t6 118 ; THUMB: t6 119 %cmp = icmp eq i16 %a, -1 120 ; ARM: cmn r{{[0-9]}}, #1 121 ; THUMB: cmn.w r{{[0-9]}}, #1 122 br i1 %cmp, label %if.then, label %if.end 123 124 if.then: ; preds = %entry 125 tail call void @foo() 126 br label %if.end 127 128 if.end: ; preds = %if.then, %entry 129 ret void 130 } 131 132 define void @t7(i16 zeroext %a) uwtable ssp { 133 entry: 134 ; ARM: t7 135 ; THUMB: t7 136 %cmp = icmp eq i16 %a, 1 137 ; ARM: cmp r{{[0-9]}}, #1 138 ; THUMB: cmp r{{[0-9]}}, #1 139 br i1 %cmp, label %if.then, label %if.end 140 141 if.then: ; preds = %entry 142 tail call void @foo() 143 br label %if.end 144 145 if.end: ; preds = %if.then, %entry 146 ret void 147 } 148 149 define void @t8(i32 %a) uwtable ssp { 150 entry: 151 ; ARM: t8 152 ; THUMB: t8 153 %cmp = icmp eq i32 %a, -1 154 ; ARM: cmn r{{[0-9]}}, #1 155 ; THUMB: cmn.w r{{[0-9]}}, #1 156 br i1 %cmp, label %if.then, label %if.end 157 158 if.then: ; preds = %entry 159 tail call void @foo() 160 br label %if.end 161 162 if.end: ; preds = %if.then, %entry 163 ret void 164 } 165 166 define void @t9(i32 %a) uwtable ssp { 167 entry: 168 ; ARM: t9 169 ; THUMB: t9 170 %cmp = icmp eq i32 %a, 1 171 ; ARM: cmp r{{[0-9]}}, #1 172 ; THUMB: cmp r{{[0-9]}}, #1 173 br i1 %cmp, label %if.then, label %if.end 174 175 if.then: ; preds = %entry 176 tail call void @foo() 177 br label %if.end 178 179 if.end: ; preds = %if.then, %entry 180 ret void 181 } 182 183 define void @t10(i32 %a) uwtable ssp { 184 entry: 185 ; ARM: t10 186 ; THUMB: t10 187 %cmp = icmp eq i32 %a, 384 188 ; ARM: cmp r{{[0-9]}}, #384 189 ; THUMB: cmp.w r{{[0-9]}}, #384 190 br i1 %cmp, label %if.then, label %if.end 191 192 if.then: ; preds = %entry 193 tail call void @foo() 194 br label %if.end 195 196 if.end: ; preds = %if.then, %entry 197 ret void 198 } 199 200 define void @t11(i32 %a) uwtable ssp { 201 entry: 202 ; ARM: t11 203 ; THUMB: t11 204 %cmp = icmp eq i32 %a, 4096 205 ; ARM: cmp r{{[0-9]}}, #4096 206 ; THUMB: cmp.w r{{[0-9]}}, #4096 207 br i1 %cmp, label %if.then, label %if.end 208 209 if.then: ; preds = %entry 210 tail call void @foo() 211 br label %if.end 212 213 if.end: ; preds = %if.then, %entry 214 ret void 215 } 216 217 define void @t12(i8 %a) uwtable ssp { 218 entry: 219 ; ARM: t12 220 ; THUMB: t12 221 %cmp = icmp ugt i8 %a, -113 222 ; ARM: cmp r{{[0-9]}}, #143 223 ; THUMB: cmp r{{[0-9]}}, #143 224 br i1 %cmp, label %if.then, label %if.end 225 226 if.then: ; preds = %entry 227 tail call void @foo() 228 br label %if.end 229 230 if.end: ; preds = %if.then, %entry 231 ret void 232 } 233 234 ; rdar://11038907 235 ; When comparing LONG_MIN/INT_MIN use a cmp instruction. 236 define void @t13() nounwind ssp { 237 entry: 238 ; ARM: t13 239 ; THUMB: t13 240 %cmp = icmp slt i32 -123, -2147483648 241 ; ARM: cmp r{{[0-9]}}, #-2147483648 242 ; THUMB: cmp.w r{{[0-9]}}, #-2147483648 243 br i1 %cmp, label %if.then, label %if.end 244 245 if.then: ; preds = %entry 246 ret void 247 248 if.end: ; preds = %entry 249 ret void 250 } 251 252