brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.1 KiB · c4e07de Raw
350 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2; RUN: llc -o - -verify-machineinstrs -O0 -global-isel -stop-after=localizer %s | FileCheck %s3target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"4target triple = "arm64-apple-ios5.0.0"5 6@var1 = common global i32 0, align 47@var2 = common global i32 0, align 48@var3 = common global i32 0, align 49@var4 = common global i32 0, align 410 11; This is an ll test instead of MIR because -run-pass doesn't seem to support12; initializing the target TTI which we need for this test.13 14; Some of the instructions in entry block are dead after this pass so don't15; strictly need to be checked for.16 17define i32 @foo() {18  ; CHECK-LABEL: name: foo19  ; CHECK: bb.1.entry:20  ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)21  ; CHECK-NEXT: {{  $}}22  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 223  ; CHECK-NEXT:   [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var224  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 325  ; CHECK-NEXT:   [[GV1:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var326  ; CHECK-NEXT:   [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 027  ; CHECK-NEXT:   [[GV2:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var128  ; CHECK-NEXT:   [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[GV2]](p0) :: (dereferenceable load (s32) from @var1)29  ; CHECK-NEXT:   [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 130  ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[LOAD]](s32), [[C3]]31  ; CHECK-NEXT:   [[C4:%[0-9]+]]:_(s1) = G_CONSTANT i1 true32  ; CHECK-NEXT:   G_BRCOND [[ICMP]](s1), %bb.333  ; CHECK-NEXT:   G_BR %bb.234  ; CHECK-NEXT: {{  $}}35  ; CHECK-NEXT: bb.2.if.then:36  ; CHECK-NEXT:   successors: %bb.3(0x80000000)37  ; CHECK-NEXT: {{  $}}38  ; CHECK-NEXT:   [[GV3:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var239  ; CHECK-NEXT:   [[C5:%[0-9]+]]:_(s32) = G_CONSTANT i32 240  ; CHECK-NEXT:   G_STORE [[C5]](s32), [[GV3]](p0) :: (store (s32) into @var2)41  ; CHECK-NEXT:   [[C6:%[0-9]+]]:_(s32) = G_CONSTANT i32 342  ; CHECK-NEXT:   [[GV4:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var143  ; CHECK-NEXT:   G_STORE [[C6]](s32), [[GV4]](p0) :: (store (s32) into @var1)44  ; CHECK-NEXT:   [[GV5:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var345  ; CHECK-NEXT:   G_STORE [[C5]](s32), [[GV5]](p0) :: (store (s32) into @var3)46  ; CHECK-NEXT:   G_STORE [[C6]](s32), [[GV4]](p0) :: (store (s32) into @var1)47  ; CHECK-NEXT:   G_BR %bb.348  ; CHECK-NEXT: {{  $}}49  ; CHECK-NEXT: bb.3.if.end:50  ; CHECK-NEXT:   [[C7:%[0-9]+]]:_(s32) = G_CONSTANT i32 051  ; CHECK-NEXT:   $w0 = COPY [[C7]](s32)52  ; CHECK-NEXT:   RET_ReallyLR implicit $w053entry:54  %0 = load i32, ptr @var1, align 455  %cmp = icmp eq i32 %0, 156  br i1 %cmp, label %if.then, label %if.end57 58if.then:59  store i32 2, ptr @var2, align 460  store i32 3, ptr @var1, align 461  store i32 2, ptr @var3, align 462  store i32 3, ptr @var1, align 463  br label %if.end64 65if.end:66  ret i32 067}68 69@tls_gv = common thread_local global i32 0, align 470 71; This test checks that we don't try to localize TLS variables on Darwin.72; If the user happens to be inside a call sequence, we could end up rematerializing73; below a physreg write, clobbering it (TLS accesses on Darwin need a function call).74; For now, we check we don't localize at all. We could in theory make sure that75; we don't localize into the middle of a call sequence instead.76define i32 @darwin_tls() {77  ; CHECK-LABEL: name: darwin_tls78  ; CHECK: bb.1.entry:79  ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)80  ; CHECK-NEXT: {{  $}}81  ; CHECK-NEXT:   [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @tls_gv82  ; CHECK-NEXT:   [[GV1:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var283  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 084  ; CHECK-NEXT:   [[GV2:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var185  ; CHECK-NEXT:   [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[GV2]](p0) :: (dereferenceable load (s32) from @var1)86  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 187  ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[LOAD]](s32), [[C1]]88  ; CHECK-NEXT:   [[C2:%[0-9]+]]:_(s1) = G_CONSTANT i1 true89  ; CHECK-NEXT:   G_BRCOND [[ICMP]](s1), %bb.390  ; CHECK-NEXT:   G_BR %bb.291  ; CHECK-NEXT: {{  $}}92  ; CHECK-NEXT: bb.2.if.then:93  ; CHECK-NEXT:   successors: %bb.3(0x80000000)94  ; CHECK-NEXT: {{  $}}95  ; CHECK-NEXT:   [[LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[GV]](p0) :: (dereferenceable load (s32) from @tls_gv)96  ; CHECK-NEXT:   [[GV3:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var297  ; CHECK-NEXT:   G_STORE [[LOAD1]](s32), [[GV3]](p0) :: (store (s32) into @var2)98  ; CHECK-NEXT:   G_BR %bb.399  ; CHECK-NEXT: {{  $}}100  ; CHECK-NEXT: bb.3.if.end:101  ; CHECK-NEXT:   [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 0102  ; CHECK-NEXT:   $w0 = COPY [[C3]](s32)103  ; CHECK-NEXT:   RET_ReallyLR implicit $w0104entry:105  %0 = load i32, ptr @var1, align 4106  %cmp = icmp eq i32 %0, 1107  br i1 %cmp, label %if.then, label %if.end108 109if.then:110  %tls = load i32, ptr @tls_gv, align 4111  store i32 %tls, ptr @var2, align 4112  br label %if.end113 114if.end:115  ret i32 0116}117 118define i32 @imm_cost_too_large_cost_of_2() {119  ; CHECK-LABEL: name: imm_cost_too_large_cost_of_2120  ; CHECK: bb.1.entry:121  ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.4(0x40000000)122  ; CHECK-NEXT: {{  $}}123  ; CHECK-NEXT:   [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var2124  ; CHECK-NEXT:   [[GV1:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var3125  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0126  ; CHECK-NEXT:   [[GV2:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var1127  ; CHECK-NEXT:   [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[GV2]](p0) :: (dereferenceable load (s32) from @var1)128  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 -2228259129  ; CHECK-NEXT:   [[CONSTANT_FOLD_BARRIER:%[0-9]+]]:_(s32) = G_CONSTANT_FOLD_BARRIER [[C1]]130  ; CHECK-NEXT:   [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1131  ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[LOAD]](s32), [[C2]]132  ; CHECK-NEXT:   [[C3:%[0-9]+]]:_(s1) = G_CONSTANT i1 true133  ; CHECK-NEXT:   G_BRCOND [[ICMP]](s1), %bb.4134  ; CHECK-NEXT:   G_BR %bb.2135  ; CHECK-NEXT: {{  $}}136  ; CHECK-NEXT: bb.2.if.then:137  ; CHECK-NEXT:   successors: %bb.3(0x80000000)138  ; CHECK-NEXT: {{  $}}139  ; CHECK-NEXT:   [[GV3:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var2140  ; CHECK-NEXT:   G_STORE [[CONSTANT_FOLD_BARRIER]](s32), [[GV3]](p0) :: (store (s32) into @var2)141  ; CHECK-NEXT:   G_BR %bb.3142  ; CHECK-NEXT: {{  $}}143  ; CHECK-NEXT: bb.3.if.then2:144  ; CHECK-NEXT:   successors: %bb.4(0x80000000)145  ; CHECK-NEXT: {{  $}}146  ; CHECK-NEXT:   [[GV4:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var1147  ; CHECK-NEXT:   G_STORE [[CONSTANT_FOLD_BARRIER]](s32), [[GV4]](p0) :: (store (s32) into @var1)148  ; CHECK-NEXT:   G_BR %bb.4149  ; CHECK-NEXT: {{  $}}150  ; CHECK-NEXT: bb.4.if.end:151  ; CHECK-NEXT:   [[GV5:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var3152  ; CHECK-NEXT:   G_STORE [[CONSTANT_FOLD_BARRIER]](s32), [[GV5]](p0) :: (store (s32) into @var3)153  ; CHECK-NEXT:   [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 0154  ; CHECK-NEXT:   $w0 = COPY [[C4]](s32)155  ; CHECK-NEXT:   RET_ReallyLR implicit $w0156entry:157  %0 = load i32, ptr @var1, align 4158  %cst1 = bitcast i32 -2228259 to i32159  %cmp = icmp eq i32 %0, 1160  br i1 %cmp, label %if.then, label %if.end161 162if.then:163  store i32 %cst1, ptr @var2164  br label %if.then2165 166if.then2:167  store i32 %cst1, ptr @var1168  br label %if.end169 170if.end:171  store i32 %cst1, ptr @var3172  ret i32 0173}174 175define i64 @imm_cost_too_large_cost_of_4() {176  ; CHECK-LABEL: name: imm_cost_too_large_cost_of_4177  ; CHECK: bb.1.entry:178  ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.4(0x40000000)179  ; CHECK-NEXT: {{  $}}180  ; CHECK-NEXT:   [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var2_64181  ; CHECK-NEXT:   [[GV1:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var3_64182  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0183  ; CHECK-NEXT:   [[GV2:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var1_64184  ; CHECK-NEXT:   [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[GV2]](p0) :: (dereferenceable load (s64) from @var1_64, align 4)185  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 -2228259186  ; CHECK-NEXT:   [[CONSTANT_FOLD_BARRIER:%[0-9]+]]:_(s64) = G_CONSTANT_FOLD_BARRIER [[C1]]187  ; CHECK-NEXT:   [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 1188  ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[LOAD]](s64), [[C2]]189  ; CHECK-NEXT:   [[C3:%[0-9]+]]:_(s1) = G_CONSTANT i1 true190  ; CHECK-NEXT:   G_BRCOND [[ICMP]](s1), %bb.4191  ; CHECK-NEXT:   G_BR %bb.2192  ; CHECK-NEXT: {{  $}}193  ; CHECK-NEXT: bb.2.if.then:194  ; CHECK-NEXT:   successors: %bb.3(0x80000000)195  ; CHECK-NEXT: {{  $}}196  ; CHECK-NEXT:   [[GV3:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var2_64197  ; CHECK-NEXT:   G_STORE [[CONSTANT_FOLD_BARRIER]](s64), [[GV3]](p0) :: (store (s64) into @var2_64)198  ; CHECK-NEXT:   G_BR %bb.3199  ; CHECK-NEXT: {{  $}}200  ; CHECK-NEXT: bb.3.if.then2:201  ; CHECK-NEXT:   successors: %bb.4(0x80000000)202  ; CHECK-NEXT: {{  $}}203  ; CHECK-NEXT:   [[GV4:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var1_64204  ; CHECK-NEXT:   G_STORE [[CONSTANT_FOLD_BARRIER]](s64), [[GV4]](p0) :: (store (s64) into @var1_64)205  ; CHECK-NEXT:   G_BR %bb.4206  ; CHECK-NEXT: {{  $}}207  ; CHECK-NEXT: bb.4.if.end:208  ; CHECK-NEXT:   [[GV5:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var3_64209  ; CHECK-NEXT:   G_STORE [[CONSTANT_FOLD_BARRIER]](s64), [[GV5]](p0) :: (store (s64) into @var3_64)210  ; CHECK-NEXT:   [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 0211  ; CHECK-NEXT:   $x0 = COPY [[C4]](s64)212  ; CHECK-NEXT:   RET_ReallyLR implicit $x0213entry:214  %0 = load i64, ptr @var1_64, align 4215  %cst1 = bitcast i64 -2228259 to i64216  %cmp = icmp eq i64 %0, 1217  br i1 %cmp, label %if.then, label %if.end218 219if.then:220  store i64 %cst1, ptr @var2_64221  br label %if.then2222 223if.then2:224  store i64 %cst1, ptr @var1_64225  br label %if.end226 227if.end:228  store i64 %cst1, ptr @var3_64229  ret i64 0230}231 232define i64 @f64_imm_cost_too_high(double %a) {233  ; CHECK-LABEL: name: f64_imm_cost_too_high234  ; CHECK: bb.1.entry:235  ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.4(0x40000000)236  ; CHECK-NEXT:   liveins: $d0237  ; CHECK-NEXT: {{  $}}238  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.000000e-02239  ; CHECK-NEXT:   [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var2_64240  ; CHECK-NEXT:   [[GV1:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var3_64241  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0242  ; CHECK-NEXT:   [[GV2:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var1_64243  ; CHECK-NEXT:   [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[GV2]](p0) :: (dereferenceable load (s64) from @var1_64, align 4)244  ; CHECK-NEXT:   [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 1245  ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[LOAD]](s64), [[C2]]246  ; CHECK-NEXT:   [[C3:%[0-9]+]]:_(s1) = G_CONSTANT i1 true247  ; CHECK-NEXT:   G_BRCOND [[ICMP]](s1), %bb.4248  ; CHECK-NEXT:   G_BR %bb.2249  ; CHECK-NEXT: {{  $}}250  ; CHECK-NEXT: bb.2.if.then:251  ; CHECK-NEXT:   successors: %bb.3(0x80000000)252  ; CHECK-NEXT: {{  $}}253  ; CHECK-NEXT:   [[GV3:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var2_64254  ; CHECK-NEXT:   G_STORE [[C]](s64), [[GV3]](p0) :: (store (s64) into @var2_64)255  ; CHECK-NEXT:   G_BR %bb.3256  ; CHECK-NEXT: {{  $}}257  ; CHECK-NEXT: bb.3.if.then2:258  ; CHECK-NEXT:   successors: %bb.4(0x80000000)259  ; CHECK-NEXT: {{  $}}260  ; CHECK-NEXT:   [[GV4:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var1_64261  ; CHECK-NEXT:   G_STORE [[C]](s64), [[GV4]](p0) :: (store (s64) into @var1_64)262  ; CHECK-NEXT:   G_BR %bb.4263  ; CHECK-NEXT: {{  $}}264  ; CHECK-NEXT: bb.4.if.end:265  ; CHECK-NEXT:   [[GV5:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var3_64266  ; CHECK-NEXT:   G_STORE [[C]](s64), [[GV5]](p0) :: (store (s64) into @var3_64)267  ; CHECK-NEXT:   [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 0268  ; CHECK-NEXT:   $x0 = COPY [[C4]](s64)269  ; CHECK-NEXT:   RET_ReallyLR implicit $x0270entry:271  %0 = load i64, ptr @var1_64, align 4272  %cmp = icmp eq i64 %0, 1273  br i1 %cmp, label %if.then, label %if.end274 275if.then:276  store double 1.000000e-02, ptr @var2_64277  br label %if.then2278 279if.then2:280  store double 1.000000e-02, ptr @var1_64281  br label %if.end282 283if.end:284  store double 1.000000e-02, ptr @var3_64285  ret i64 0286}287 288define i64 @f64_imm_cheap(double %a) {289  ; CHECK-LABEL: name: f64_imm_cheap290  ; CHECK: bb.1.entry:291  ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.4(0x40000000)292  ; CHECK-NEXT:   liveins: $d0293  ; CHECK-NEXT: {{  $}}294  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s64) = G_FCONSTANT double 0.000000e+00295  ; CHECK-NEXT:   [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var2_64296  ; CHECK-NEXT:   [[GV1:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var3_64297  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0298  ; CHECK-NEXT:   [[GV2:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var1_64299  ; CHECK-NEXT:   [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[GV2]](p0) :: (dereferenceable load (s64) from @var1_64, align 4)300  ; CHECK-NEXT:   [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 1301  ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[LOAD]](s64), [[C2]]302  ; CHECK-NEXT:   [[C3:%[0-9]+]]:_(s1) = G_CONSTANT i1 true303  ; CHECK-NEXT:   G_BRCOND [[ICMP]](s1), %bb.4304  ; CHECK-NEXT:   G_BR %bb.2305  ; CHECK-NEXT: {{  $}}306  ; CHECK-NEXT: bb.2.if.then:307  ; CHECK-NEXT:   successors: %bb.3(0x80000000)308  ; CHECK-NEXT: {{  $}}309  ; CHECK-NEXT:   [[GV3:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var2_64310  ; CHECK-NEXT:   [[C4:%[0-9]+]]:_(s64) = G_FCONSTANT double 0.000000e+00311  ; CHECK-NEXT:   G_STORE [[C4]](s64), [[GV3]](p0) :: (store (s64) into @var2_64)312  ; CHECK-NEXT:   G_BR %bb.3313  ; CHECK-NEXT: {{  $}}314  ; CHECK-NEXT: bb.3.if.then2:315  ; CHECK-NEXT:   successors: %bb.4(0x80000000)316  ; CHECK-NEXT: {{  $}}317  ; CHECK-NEXT:   [[C5:%[0-9]+]]:_(s64) = G_FCONSTANT double 0.000000e+00318  ; CHECK-NEXT:   [[GV4:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var1_64319  ; CHECK-NEXT:   G_STORE [[C5]](s64), [[GV4]](p0) :: (store (s64) into @var1_64)320  ; CHECK-NEXT:   G_BR %bb.4321  ; CHECK-NEXT: {{  $}}322  ; CHECK-NEXT: bb.4.if.end:323  ; CHECK-NEXT:   [[GV5:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var3_64324  ; CHECK-NEXT:   [[C6:%[0-9]+]]:_(s64) = G_FCONSTANT double 0.000000e+00325  ; CHECK-NEXT:   G_STORE [[C6]](s64), [[GV5]](p0) :: (store (s64) into @var3_64)326  ; CHECK-NEXT:   [[C7:%[0-9]+]]:_(s64) = G_CONSTANT i64 0327  ; CHECK-NEXT:   $x0 = COPY [[C7]](s64)328  ; CHECK-NEXT:   RET_ReallyLR implicit $x0329entry:330  %0 = load i64, ptr @var1_64, align 4331  %cmp = icmp eq i64 %0, 1332  br i1 %cmp, label %if.then, label %if.end333 334if.then:335  store double 0.0, ptr @var2_64336  br label %if.then2337 338if.then2:339  store double 0.0, ptr @var1_64340  br label %if.end341 342if.end:343  store double 0.0, ptr @var3_64344  ret i64 0345}346 347@var1_64 = common global i64 0, align 4348@var2_64 = common global i64 0, align 4349@var3_64 = common global i64 0, align 4350