Home | History | Annotate | Download | only in X86
      1 ; RUN: llc -mtriple=i386-pc-linux-gnu < %s -o - | FileCheck --check-prefix=LINUX-I386 %s
      2 ; RUN: llc -mtriple=x86_64-pc-linux-gnu < %s -o - | FileCheck --check-prefix=LINUX-X64 %s
      3 ; RUN: llc -code-model=kernel -mtriple=x86_64-pc-linux-gnu < %s -o - | FileCheck --check-prefix=LINUX-KERNEL-X64 %s
      4 ; RUN: llc -mtriple=x86_64-apple-darwin < %s -o - | FileCheck --check-prefix=DARWIN-X64 %s
      5 ; RUN: llc -mtriple=amd64-pc-openbsd < %s -o - | FileCheck --check-prefix=OPENBSD-AMD64 %s
      6 
      7 %struct.foo = type { [16 x i8] }
      8 %struct.foo.0 = type { [4 x i8] }
      9 %struct.pair = type { i32, i32 }
     10 %struct.nest = type { %struct.pair, %struct.pair }
     11 %struct.vec = type { <4 x i32> }
     12 %class.A = type { [2 x i8] }
     13 %struct.deep = type { %union.anon }
     14 %union.anon = type { %struct.anon }
     15 %struct.anon = type { %struct.anon.0 }
     16 %struct.anon.0 = type { %union.anon.1 }
     17 %union.anon.1 = type { [2 x i8] }
     18 %struct.small = type { i8 }
     19 
     20 @.str = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1
     21 
     22 ; test1a: array of [16 x i8] 
     23 ;         no ssp attribute
     24 ; Requires no protector.
     25 define void @test1a(i8* %a) nounwind uwtable {
     26 entry:
     27 ; LINUX-I386-LABEL: test1a:
     28 ; LINUX-I386-NOT: calll __stack_chk_fail
     29 ; LINUX-I386: .cfi_endproc
     30 
     31 ; LINUX-X64-LABEL: test1a:
     32 ; LINUX-X64-NOT: callq __stack_chk_fail
     33 ; LINUX-X64: .cfi_endproc
     34 
     35 ; LINUX-KERNEL-X64-LABEL: test1a:
     36 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
     37 ; LINUX-KERNEL-X64: .cfi_endproc
     38 
     39 ; DARWIN-X64-LABEL: test1a:
     40 ; DARWIN-X64-NOT: callq ___stack_chk_fail
     41 ; DARWIN-X64: .cfi_endproc
     42   %a.addr = alloca i8*, align 8
     43   %buf = alloca [16 x i8], align 16
     44   store i8* %a, i8** %a.addr, align 8
     45   %arraydecay = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0
     46   %0 = load i8** %a.addr, align 8
     47   %call = call i8* @strcpy(i8* %arraydecay, i8* %0)
     48   %arraydecay1 = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0
     49   %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1)
     50   ret void
     51 }
     52 
     53 ; test1b: array of [16 x i8] 
     54 ;         ssp attribute
     55 ; Requires protector.
     56 define void @test1b(i8* %a) nounwind uwtable ssp {
     57 entry:
     58 ; LINUX-I386-LABEL: test1b:
     59 ; LINUX-I386: mov{{l|q}} %gs:
     60 ; LINUX-I386: calll __stack_chk_fail
     61 
     62 ; LINUX-X64-LABEL: test1b:
     63 ; LINUX-X64: mov{{l|q}} %fs:
     64 ; LINUX-X64: callq __stack_chk_fail
     65 
     66 ; LINUX-KERNEL-X64-LABEL: test1b:
     67 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
     68 ; LINUX-KERNEL-X64: callq __stack_chk_fail
     69 
     70 ; DARWIN-X64-LABEL: test1b:
     71 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
     72 ; DARWIN-X64: callq ___stack_chk_fail
     73 
     74 ; OPENBSD-AMD64-LABEL: test1b:
     75 ; OPENBSD-AMD64: movq __guard_local(%rip)
     76 ; OPENBSD-AMD64: callq __stack_smash_handler
     77   %a.addr = alloca i8*, align 8
     78   %buf = alloca [16 x i8], align 16
     79   store i8* %a, i8** %a.addr, align 8
     80   %arraydecay = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0
     81   %0 = load i8** %a.addr, align 8
     82   %call = call i8* @strcpy(i8* %arraydecay, i8* %0)
     83   %arraydecay1 = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0
     84   %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1)
     85   ret void
     86 }
     87 
     88 ; test1c: array of [16 x i8] 
     89 ;         sspstrong attribute
     90 ; Requires protector.
     91 define void @test1c(i8* %a) nounwind uwtable sspstrong {
     92 entry:
     93 ; LINUX-I386-LABEL: test1c:
     94 ; LINUX-I386: mov{{l|q}} %gs:
     95 ; LINUX-I386: calll __stack_chk_fail
     96 
     97 ; LINUX-X64-LABEL: test1c:
     98 ; LINUX-X64: mov{{l|q}} %fs:
     99 ; LINUX-X64: callq __stack_chk_fail
    100 
    101 ; LINUX-KERNEL-X64-LABEL: test1c:
    102 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
    103 ; LINUX-KERNEL-X64: callq __stack_chk_fail
    104 
    105 ; DARWIN-X64-LABEL: test1c:
    106 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
    107 ; DARWIN-X64: callq ___stack_chk_fail
    108   %a.addr = alloca i8*, align 8
    109   %buf = alloca [16 x i8], align 16
    110   store i8* %a, i8** %a.addr, align 8
    111   %arraydecay = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0
    112   %0 = load i8** %a.addr, align 8
    113   %call = call i8* @strcpy(i8* %arraydecay, i8* %0)
    114   %arraydecay1 = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0
    115   %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1)
    116   ret void
    117 }
    118 
    119 ; test1d: array of [16 x i8] 
    120 ;         sspreq attribute
    121 ; Requires protector.
    122 define void @test1d(i8* %a) nounwind uwtable sspreq {
    123 entry:
    124 ; LINUX-I386-LABEL: test1d:
    125 ; LINUX-I386: mov{{l|q}} %gs:
    126 ; LINUX-I386: calll __stack_chk_fail
    127 
    128 ; LINUX-X64-LABEL: test1d:
    129 ; LINUX-X64: mov{{l|q}} %fs:
    130 ; LINUX-X64: callq __stack_chk_fail
    131 
    132 ; LINUX-KERNEL-X64-LABEL: test1d:
    133 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
    134 ; LINUX-KERNEL-X64: callq __stack_chk_fail
    135 
    136 ; DARWIN-X64-LABEL: test1d:
    137 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
    138 ; DARWIN-X64: callq ___stack_chk_fail
    139   %a.addr = alloca i8*, align 8
    140   %buf = alloca [16 x i8], align 16
    141   store i8* %a, i8** %a.addr, align 8
    142   %arraydecay = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0
    143   %0 = load i8** %a.addr, align 8
    144   %call = call i8* @strcpy(i8* %arraydecay, i8* %0)
    145   %arraydecay1 = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0
    146   %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1)
    147   ret void
    148 }
    149 
    150 ; test2a: struct { [16 x i8] }
    151 ;         no ssp attribute
    152 ; Requires no protector.
    153 define void @test2a(i8* %a) nounwind uwtable {
    154 entry:
    155 ; LINUX-I386-LABEL: test2a:
    156 ; LINUX-I386-NOT: calll __stack_chk_fail
    157 ; LINUX-I386: .cfi_endproc
    158 
    159 ; LINUX-X64-LABEL: test2a:
    160 ; LINUX-X64-NOT: callq __stack_chk_fail
    161 ; LINUX-X64: .cfi_endproc
    162 
    163 ; LINUX-KERNEL-X64-LABEL: test2a:
    164 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
    165 ; LINUX-KERNEL-X64: .cfi_endproc
    166 
    167 ; DARWIN-X64-LABEL: test2a:
    168 ; DARWIN-X64-NOT: callq ___stack_chk_fail
    169 ; DARWIN-X64: .cfi_endproc
    170   %a.addr = alloca i8*, align 8
    171   %b = alloca %struct.foo, align 1
    172   store i8* %a, i8** %a.addr, align 8
    173   %buf = getelementptr inbounds %struct.foo* %b, i32 0, i32 0
    174   %arraydecay = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0
    175   %0 = load i8** %a.addr, align 8
    176   %call = call i8* @strcpy(i8* %arraydecay, i8* %0)
    177   %buf1 = getelementptr inbounds %struct.foo* %b, i32 0, i32 0
    178   %arraydecay2 = getelementptr inbounds [16 x i8]* %buf1, i32 0, i32 0
    179   %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2)
    180   ret void
    181 }
    182 
    183 ; test2b: struct { [16 x i8] }
    184 ;          ssp attribute
    185 ; Requires protector.
    186 define void @test2b(i8* %a) nounwind uwtable ssp {
    187 entry:
    188 ; LINUX-I386-LABEL: test2b:
    189 ; LINUX-I386: mov{{l|q}} %gs:
    190 ; LINUX-I386: calll __stack_chk_fail
    191 
    192 ; LINUX-X64-LABEL: test2b:
    193 ; LINUX-X64: mov{{l|q}} %fs:
    194 ; LINUX-X64: callq __stack_chk_fail
    195 
    196 ; LINUX-KERNEL-X64-LABEL: test2b:
    197 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
    198 ; LINUX-KERNEL-X64: callq __stack_chk_fail
    199 
    200 ; DARWIN-X64-LABEL: test2b:
    201 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
    202 ; DARWIN-X64: callq ___stack_chk_fail
    203   %a.addr = alloca i8*, align 8
    204   %b = alloca %struct.foo, align 1
    205   store i8* %a, i8** %a.addr, align 8
    206   %buf = getelementptr inbounds %struct.foo* %b, i32 0, i32 0
    207   %arraydecay = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0
    208   %0 = load i8** %a.addr, align 8
    209   %call = call i8* @strcpy(i8* %arraydecay, i8* %0)
    210   %buf1 = getelementptr inbounds %struct.foo* %b, i32 0, i32 0
    211   %arraydecay2 = getelementptr inbounds [16 x i8]* %buf1, i32 0, i32 0
    212   %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2)
    213   ret void
    214 }
    215 
    216 ; test2c: struct { [16 x i8] }
    217 ;          sspstrong attribute
    218 ; Requires protector.
    219 define void @test2c(i8* %a) nounwind uwtable sspstrong {
    220 entry:
    221 ; LINUX-I386-LABEL: test2c:
    222 ; LINUX-I386: mov{{l|q}} %gs:
    223 ; LINUX-I386: calll __stack_chk_fail
    224 
    225 ; LINUX-X64-LABEL: test2c:
    226 ; LINUX-X64: mov{{l|q}} %fs:
    227 ; LINUX-X64: callq __stack_chk_fail
    228 
    229 ; LINUX-KERNEL-X64-LABEL: test2c:
    230 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
    231 ; LINUX-KERNEL-X64: callq __stack_chk_fail
    232 
    233 ; DARWIN-X64-LABEL: test2c:
    234 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
    235 ; DARWIN-X64: callq ___stack_chk_fail
    236   %a.addr = alloca i8*, align 8
    237   %b = alloca %struct.foo, align 1
    238   store i8* %a, i8** %a.addr, align 8
    239   %buf = getelementptr inbounds %struct.foo* %b, i32 0, i32 0
    240   %arraydecay = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0
    241   %0 = load i8** %a.addr, align 8
    242   %call = call i8* @strcpy(i8* %arraydecay, i8* %0)
    243   %buf1 = getelementptr inbounds %struct.foo* %b, i32 0, i32 0
    244   %arraydecay2 = getelementptr inbounds [16 x i8]* %buf1, i32 0, i32 0
    245   %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2)
    246   ret void
    247 }
    248 
    249 ; test2d: struct { [16 x i8] }
    250 ;          sspreq attribute
    251 ; Requires protector.
    252 define void @test2d(i8* %a) nounwind uwtable sspreq {
    253 entry:
    254 ; LINUX-I386-LABEL: test2d:
    255 ; LINUX-I386: mov{{l|q}} %gs:
    256 ; LINUX-I386: calll __stack_chk_fail
    257 
    258 ; LINUX-X64-LABEL: test2d:
    259 ; LINUX-X64: mov{{l|q}} %fs:
    260 ; LINUX-X64: callq __stack_chk_fail
    261 
    262 ; LINUX-KERNEL-X64-LABEL: test2d:
    263 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
    264 ; LINUX-KERNEL-X64: callq __stack_chk_fail
    265 
    266 ; DARWIN-X64-LABEL: test2d:
    267 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
    268 ; DARWIN-X64: callq ___stack_chk_fail
    269   %a.addr = alloca i8*, align 8
    270   %b = alloca %struct.foo, align 1
    271   store i8* %a, i8** %a.addr, align 8
    272   %buf = getelementptr inbounds %struct.foo* %b, i32 0, i32 0
    273   %arraydecay = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0
    274   %0 = load i8** %a.addr, align 8
    275   %call = call i8* @strcpy(i8* %arraydecay, i8* %0)
    276   %buf1 = getelementptr inbounds %struct.foo* %b, i32 0, i32 0
    277   %arraydecay2 = getelementptr inbounds [16 x i8]* %buf1, i32 0, i32 0
    278   %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2)
    279   ret void
    280 }
    281 
    282 ; test3a:  array of [4 x i8]
    283 ;          no ssp attribute
    284 ; Requires no protector.
    285 define void @test3a(i8* %a) nounwind uwtable {
    286 entry:
    287 ; LINUX-I386-LABEL: test3a:
    288 ; LINUX-I386-NOT: calll __stack_chk_fail
    289 ; LINUX-I386: .cfi_endproc
    290 
    291 ; LINUX-X64-LABEL: test3a:
    292 ; LINUX-X64-NOT: callq __stack_chk_fail
    293 ; LINUX-X64: .cfi_endproc
    294 
    295 ; LINUX-KERNEL-X64-LABEL: test3a:
    296 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
    297 ; LINUX-KERNEL-X64: .cfi_endproc
    298 
    299 ; DARWIN-X64-LABEL: test3a:
    300 ; DARWIN-X64-NOT: callq ___stack_chk_fail
    301 ; DARWIN-X64: .cfi_endproc
    302   %a.addr = alloca i8*, align 8
    303   %buf = alloca [4 x i8], align 1
    304   store i8* %a, i8** %a.addr, align 8
    305   %arraydecay = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0
    306   %0 = load i8** %a.addr, align 8
    307   %call = call i8* @strcpy(i8* %arraydecay, i8* %0)
    308   %arraydecay1 = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0
    309   %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1)
    310   ret void
    311 }
    312 
    313 ; test3b:  array [4 x i8]
    314 ;          ssp attribute
    315 ; Requires no protector.
    316 define void @test3b(i8* %a) nounwind uwtable ssp {
    317 entry:
    318 ; LINUX-I386-LABEL: test3b:
    319 ; LINUX-I386-NOT: calll __stack_chk_fail
    320 ; LINUX-I386: .cfi_endproc
    321 
    322 ; LINUX-X64-LABEL: test3b:
    323 ; LINUX-X64-NOT: callq __stack_chk_fail
    324 ; LINUX-X64: .cfi_endproc
    325 
    326 ; LINUX-KERNEL-X64-LABEL: test3b:
    327 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
    328 ; LINUX-KERNEL-X64: .cfi_endproc
    329 
    330 ; DARWIN-X64-LABEL: test3b:
    331 ; DARWIN-X64-NOT: callq ___stack_chk_fail
    332 ; DARWIN-X64: .cfi_endproc
    333   %a.addr = alloca i8*, align 8
    334   %buf = alloca [4 x i8], align 1
    335   store i8* %a, i8** %a.addr, align 8
    336   %arraydecay = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0
    337   %0 = load i8** %a.addr, align 8
    338   %call = call i8* @strcpy(i8* %arraydecay, i8* %0)
    339   %arraydecay1 = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0
    340   %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1)
    341   ret void
    342 }
    343 
    344 ; test3c:  array of [4 x i8]
    345 ;          sspstrong attribute
    346 ; Requires protector.
    347 define void @test3c(i8* %a) nounwind uwtable sspstrong {
    348 entry:
    349 ; LINUX-I386-LABEL: test3c:
    350 ; LINUX-I386: mov{{l|q}} %gs:
    351 ; LINUX-I386: calll __stack_chk_fail
    352 
    353 ; LINUX-X64-LABEL: test3c:
    354 ; LINUX-X64: mov{{l|q}} %fs:
    355 ; LINUX-X64: callq __stack_chk_fail
    356 
    357 ; LINUX-KERNEL-X64-LABEL: test3c:
    358 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
    359 ; LINUX-KERNEL-X64: callq __stack_chk_fail
    360 
    361 ; DARWIN-X64-LABEL: test3c:
    362 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
    363 ; DARWIN-X64: callq ___stack_chk_fail
    364   %a.addr = alloca i8*, align 8
    365   %buf = alloca [4 x i8], align 1
    366   store i8* %a, i8** %a.addr, align 8
    367   %arraydecay = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0
    368   %0 = load i8** %a.addr, align 8
    369   %call = call i8* @strcpy(i8* %arraydecay, i8* %0)
    370   %arraydecay1 = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0
    371   %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1)
    372   ret void
    373 }
    374 
    375 ; test3d:  array of [4 x i8]
    376 ;          sspreq attribute
    377 ; Requires protector.
    378 define void @test3d(i8* %a) nounwind uwtable sspreq {
    379 entry:
    380 ; LINUX-I386-LABEL: test3d:
    381 ; LINUX-I386: mov{{l|q}} %gs:
    382 ; LINUX-I386: calll __stack_chk_fail
    383 
    384 ; LINUX-X64-LABEL: test3d:
    385 ; LINUX-X64: mov{{l|q}} %fs:
    386 ; LINUX-X64: callq __stack_chk_fail
    387 
    388 ; LINUX-KERNEL-X64-LABEL: test3d:
    389 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
    390 ; LINUX-KERNEL-X64: callq __stack_chk_fail
    391 
    392 ; DARWIN-X64-LABEL: test3d:
    393 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
    394 ; DARWIN-X64: callq ___stack_chk_fail
    395   %a.addr = alloca i8*, align 8
    396   %buf = alloca [4 x i8], align 1
    397   store i8* %a, i8** %a.addr, align 8
    398   %arraydecay = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0
    399   %0 = load i8** %a.addr, align 8
    400   %call = call i8* @strcpy(i8* %arraydecay, i8* %0)
    401   %arraydecay1 = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0
    402   %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1)
    403   ret void
    404 }
    405 
    406 ; test4a:  struct { [4 x i8] }
    407 ;          no ssp attribute
    408 ; Requires no protector.
    409 define void @test4a(i8* %a) nounwind uwtable {
    410 entry:
    411 ; LINUX-I386-LABEL: test4a:
    412 ; LINUX-I386-NOT: calll __stack_chk_fail
    413 ; LINUX-I386: .cfi_endproc
    414 
    415 ; LINUX-X64-LABEL: test4a:
    416 ; LINUX-X64-NOT: callq __stack_chk_fail
    417 ; LINUX-X64: .cfi_endproc
    418 
    419 ; LINUX-KERNEL-X64-LABEL: test4a:
    420 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
    421 ; LINUX-KERNEL-X64: .cfi_endproc
    422 
    423 ; DARWIN-X64-LABEL: test4a:
    424 ; DARWIN-X64-NOT: callq ___stack_chk_fail
    425 ; DARWIN-X64: .cfi_endproc
    426   %a.addr = alloca i8*, align 8
    427   %b = alloca %struct.foo.0, align 1
    428   store i8* %a, i8** %a.addr, align 8
    429   %buf = getelementptr inbounds %struct.foo.0* %b, i32 0, i32 0
    430   %arraydecay = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0
    431   %0 = load i8** %a.addr, align 8
    432   %call = call i8* @strcpy(i8* %arraydecay, i8* %0)
    433   %buf1 = getelementptr inbounds %struct.foo.0* %b, i32 0, i32 0
    434   %arraydecay2 = getelementptr inbounds [4 x i8]* %buf1, i32 0, i32 0
    435   %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2)
    436   ret void
    437 }
    438 
    439 ; test4b:  struct { [4 x i8] }
    440 ;          ssp attribute
    441 ; Requires no protector.
    442 define void @test4b(i8* %a) nounwind uwtable ssp {
    443 entry:
    444 ; LINUX-I386-LABEL: test4b:
    445 ; LINUX-I386-NOT: calll __stack_chk_fail
    446 ; LINUX-I386: .cfi_endproc
    447 
    448 ; LINUX-X64-LABEL: test4b:
    449 ; LINUX-X64-NOT: callq __stack_chk_fail
    450 ; LINUX-X64: .cfi_endproc
    451 
    452 ; LINUX-KERNEL-X64-LABEL: test4b:
    453 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
    454 ; LINUX-KERNEL-X64: .cfi_endproc
    455 
    456 ; DARWIN-X64-LABEL: test4b:
    457 ; DARWIN-X64-NOT: callq ___stack_chk_fail
    458 ; DARWIN-X64: .cfi_endproc
    459   %a.addr = alloca i8*, align 8
    460   %b = alloca %struct.foo.0, align 1
    461   store i8* %a, i8** %a.addr, align 8
    462   %buf = getelementptr inbounds %struct.foo.0* %b, i32 0, i32 0
    463   %arraydecay = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0
    464   %0 = load i8** %a.addr, align 8
    465   %call = call i8* @strcpy(i8* %arraydecay, i8* %0)
    466   %buf1 = getelementptr inbounds %struct.foo.0* %b, i32 0, i32 0
    467   %arraydecay2 = getelementptr inbounds [4 x i8]* %buf1, i32 0, i32 0
    468   %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2)
    469   ret void
    470 }
    471 
    472 ; test4c:  struct { [4 x i8] }
    473 ;          sspstrong attribute
    474 ; Requires protector.
    475 define void @test4c(i8* %a) nounwind uwtable sspstrong {
    476 entry:
    477 ; LINUX-I386-LABEL: test4c:
    478 ; LINUX-I386: mov{{l|q}} %gs:
    479 ; LINUX-I386: calll __stack_chk_fail
    480 
    481 ; LINUX-X64-LABEL: test4c:
    482 ; LINUX-X64: mov{{l|q}} %fs:
    483 ; LINUX-X64: callq __stack_chk_fail
    484 
    485 ; LINUX-KERNEL-X64-LABEL: test4c:
    486 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
    487 ; LINUX-KERNEL-X64: callq __stack_chk_fail
    488 
    489 ; DARWIN-X64-LABEL: test4c:
    490 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
    491 ; DARWIN-X64: callq ___stack_chk_fail
    492   %a.addr = alloca i8*, align 8
    493   %b = alloca %struct.foo.0, align 1
    494   store i8* %a, i8** %a.addr, align 8
    495   %buf = getelementptr inbounds %struct.foo.0* %b, i32 0, i32 0
    496   %arraydecay = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0
    497   %0 = load i8** %a.addr, align 8
    498   %call = call i8* @strcpy(i8* %arraydecay, i8* %0)
    499   %buf1 = getelementptr inbounds %struct.foo.0* %b, i32 0, i32 0
    500   %arraydecay2 = getelementptr inbounds [4 x i8]* %buf1, i32 0, i32 0
    501   %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2)
    502   ret void
    503 }
    504 
    505 ; test4d:  struct { [4 x i8] }
    506 ;          sspreq attribute
    507 ; Requires protector.
    508 define void @test4d(i8* %a) nounwind uwtable sspreq {
    509 entry:
    510 ; LINUX-I386-LABEL: test4d:
    511 ; LINUX-I386: mov{{l|q}} %gs:
    512 ; LINUX-I386: calll __stack_chk_fail
    513 
    514 ; LINUX-X64-LABEL: test4d:
    515 ; LINUX-X64: mov{{l|q}} %fs:
    516 ; LINUX-X64: callq __stack_chk_fail
    517 
    518 ; LINUX-KERNEL-X64-LABEL: test4d:
    519 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
    520 ; LINUX-KERNEL-X64: callq __stack_chk_fail
    521 
    522 ; DARWIN-X64-LABEL: test4d:
    523 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
    524 ; DARWIN-X64: callq ___stack_chk_fail
    525   %a.addr = alloca i8*, align 8
    526   %b = alloca %struct.foo.0, align 1
    527   store i8* %a, i8** %a.addr, align 8
    528   %buf = getelementptr inbounds %struct.foo.0* %b, i32 0, i32 0
    529   %arraydecay = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0
    530   %0 = load i8** %a.addr, align 8
    531   %call = call i8* @strcpy(i8* %arraydecay, i8* %0)
    532   %buf1 = getelementptr inbounds %struct.foo.0* %b, i32 0, i32 0
    533   %arraydecay2 = getelementptr inbounds [4 x i8]* %buf1, i32 0, i32 0
    534   %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2)
    535   ret void
    536 }
    537 
    538 ; test5a:  no arrays / no nested arrays
    539 ;          no ssp attribute
    540 ; Requires no protector.
    541 define void @test5a(i8* %a) nounwind uwtable {
    542 entry:
    543 ; LINUX-I386-LABEL: test5a:
    544 ; LINUX-I386-NOT: calll __stack_chk_fail
    545 ; LINUX-I386: .cfi_endproc
    546 
    547 ; LINUX-X64-LABEL: test5a:
    548 ; LINUX-X64-NOT: callq __stack_chk_fail
    549 ; LINUX-X64: .cfi_endproc
    550 
    551 ; LINUX-KERNEL-X64-LABEL: test5a:
    552 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
    553 ; LINUX-KERNEL-X64: .cfi_endproc
    554 
    555 ; DARWIN-X64-LABEL: test5a:
    556 ; DARWIN-X64-NOT: callq ___stack_chk_fail
    557 ; DARWIN-X64: .cfi_endproc
    558   %a.addr = alloca i8*, align 8
    559   store i8* %a, i8** %a.addr, align 8
    560   %0 = load i8** %a.addr, align 8
    561   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %0)
    562   ret void
    563 }
    564 
    565 ; test5b:  no arrays / no nested arrays
    566 ;          ssp attribute
    567 ; Requires no protector.
    568 define void @test5b(i8* %a) nounwind uwtable ssp {
    569 entry:
    570 ; LINUX-I386-LABEL: test5b:
    571 ; LINUX-I386-NOT: calll __stack_chk_fail
    572 ; LINUX-I386: .cfi_endproc
    573 
    574 ; LINUX-X64-LABEL: test5b:
    575 ; LINUX-X64-NOT: callq __stack_chk_fail
    576 ; LINUX-X64: .cfi_endproc
    577 
    578 ; LINUX-KERNEL-X64-LABEL: test5b:
    579 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
    580 ; LINUX-KERNEL-X64: .cfi_endproc
    581 
    582 ; DARWIN-X64-LABEL: test5b:
    583 ; DARWIN-X64-NOT: callq ___stack_chk_fail
    584 ; DARWIN-X64: .cfi_endproc
    585   %a.addr = alloca i8*, align 8
    586   store i8* %a, i8** %a.addr, align 8
    587   %0 = load i8** %a.addr, align 8
    588   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %0)
    589   ret void
    590 }
    591 
    592 ; test5c:  no arrays / no nested arrays
    593 ;          sspstrong attribute
    594 ; Requires no protector.
    595 define void @test5c(i8* %a) nounwind uwtable sspstrong {
    596 entry:
    597 ; LINUX-I386-LABEL: test5c:
    598 ; LINUX-I386-NOT: calll __stack_chk_fail
    599 ; LINUX-I386: .cfi_endproc
    600 
    601 ; LINUX-X64-LABEL: test5c:
    602 ; LINUX-X64-NOT: callq __stack_chk_fail
    603 ; LINUX-X64: .cfi_endproc
    604 
    605 ; LINUX-KERNEL-X64-LABEL: test5c:
    606 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
    607 ; LINUX-KERNEL-X64: .cfi_endproc
    608 
    609 ; DARWIN-X64-LABEL: test5c:
    610 ; DARWIN-X64-NOT: callq ___stack_chk_fail
    611 ; DARWIN-X64: .cfi_endproc
    612   %a.addr = alloca i8*, align 8
    613   store i8* %a, i8** %a.addr, align 8
    614   %0 = load i8** %a.addr, align 8
    615   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %0)
    616   ret void
    617 }
    618 
    619 ; test5d:  no arrays / no nested arrays
    620 ;          sspreq attribute
    621 ; Requires protector.
    622 define void @test5d(i8* %a) nounwind uwtable sspreq {
    623 entry:
    624 ; LINUX-I386-LABEL: test5d:
    625 ; LINUX-I386: mov{{l|q}} %gs:
    626 ; LINUX-I386: calll __stack_chk_fail
    627 
    628 ; LINUX-X64-LABEL: test5d:
    629 ; LINUX-X64: mov{{l|q}} %fs:
    630 ; LINUX-X64: callq __stack_chk_fail
    631 
    632 ; LINUX-KERNEL-X64-LABEL: test5d:
    633 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
    634 ; LINUX-KERNEL-X64: callq __stack_chk_fail
    635 
    636 ; DARWIN-X64-LABEL: test5d:
    637 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
    638 ; DARWIN-X64: callq ___stack_chk_fail
    639   %a.addr = alloca i8*, align 8
    640   store i8* %a, i8** %a.addr, align 8
    641   %0 = load i8** %a.addr, align 8
    642   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %0)
    643   ret void
    644 }
    645 
    646 ; test6a:  Address-of local taken (j = &a)
    647 ;          no ssp attribute
    648 ; Requires no protector.
    649 define void @test6a() nounwind uwtable {
    650 entry:
    651 ; LINUX-I386-LABEL: test6a:
    652 ; LINUX-I386-NOT: calll __stack_chk_fail
    653 ; LINUX-I386: .cfi_endproc
    654 
    655 ; LINUX-X64-LABEL: test6a:
    656 ; LINUX-X64-NOT: callq __stack_chk_fail
    657 ; LINUX-X64: .cfi_endproc
    658 
    659 ; LINUX-KERNEL-X64-LABEL: test6a:
    660 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
    661 ; LINUX-KERNEL-X64: .cfi_endproc
    662 
    663 ; DARWIN-X64-LABEL: test6a:
    664 ; DARWIN-X64-NOT: callq ___stack_chk_fail
    665 ; DARWIN-X64: .cfi_endproc
    666   %retval = alloca i32, align 4
    667   %a = alloca i32, align 4
    668   %j = alloca i32*, align 8
    669   store i32 0, i32* %retval
    670   %0 = load i32* %a, align 4
    671   %add = add nsw i32 %0, 1
    672   store i32 %add, i32* %a, align 4
    673   store i32* %a, i32** %j, align 8
    674   ret void
    675 }
    676 
    677 ; test6b:  Address-of local taken (j = &a)
    678 ;          ssp attribute
    679 ; Requires no protector.
    680 define void @test6b() nounwind uwtable ssp {
    681 entry:
    682 ; LINUX-I386-LABEL: test6b:
    683 ; LINUX-I386-NOT: calll __stack_chk_fail
    684 ; LINUX-I386: .cfi_endproc
    685 
    686 ; LINUX-X64-LABEL: test6b:
    687 ; LINUX-X64-NOT: callq __stack_chk_fail
    688 ; LINUX-X64: .cfi_endproc
    689 
    690 ; LINUX-KERNEL-X64-LABEL: test6b:
    691 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
    692 ; LINUX-KERNEL-X64: .cfi_endproc
    693 
    694 ; DARWIN-X64-LABEL: test6b:
    695 ; DARWIN-X64-NOT: callq ___stack_chk_fail
    696 ; DARWIN-X64: .cfi_endproc
    697   %retval = alloca i32, align 4
    698   %a = alloca i32, align 4
    699   %j = alloca i32*, align 8
    700   store i32 0, i32* %retval
    701   %0 = load i32* %a, align 4
    702   %add = add nsw i32 %0, 1
    703   store i32 %add, i32* %a, align 4
    704   store i32* %a, i32** %j, align 8
    705   ret void
    706 }
    707 
    708 ; test6c:  Address-of local taken (j = &a)
    709 ;          sspstrong attribute
    710 ; Requires protector.
    711 define void @test6c() nounwind uwtable sspstrong {
    712 entry:
    713 ; LINUX-I386-LABEL: test6c:
    714 ; LINUX-I386: mov{{l|q}} %gs:
    715 ; LINUX-I386: calll __stack_chk_fail
    716 
    717 ; LINUX-X64-LABEL: test6c:
    718 ; LINUX-X64: mov{{l|q}} %fs:
    719 ; LINUX-X64: callq __stack_chk_fail
    720 
    721 ; LINUX-KERNEL-X64-LABEL: test6c:
    722 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
    723 ; LINUX-KERNEL-X64: callq __stack_chk_fail
    724 
    725 ; DARWIN-X64-LABEL: test6c:
    726 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
    727 ; DARWIN-X64: callq ___stack_chk_fail
    728   %retval = alloca i32, align 4
    729   %a = alloca i32, align 4
    730   %j = alloca i32*, align 8
    731   store i32 0, i32* %retval
    732   %0 = load i32* %a, align 4
    733   %add = add nsw i32 %0, 1
    734   store i32 %add, i32* %a, align 4
    735   store i32* %a, i32** %j, align 8
    736   ret void
    737 }
    738 
    739 ; test6d:  Address-of local taken (j = &a)
    740 ;          sspreq attribute
    741 ; Requires protector.
    742 define void @test6d() nounwind uwtable sspreq {
    743 entry:
    744 ; LINUX-I386-LABEL: test6d:
    745 ; LINUX-I386: mov{{l|q}} %gs:
    746 ; LINUX-I386: calll __stack_chk_fail
    747 
    748 ; LINUX-X64-LABEL: test6d:
    749 ; LINUX-X64: mov{{l|q}} %fs:
    750 ; LINUX-X64: callq __stack_chk_fail
    751 
    752 ; LINUX-KERNEL-X64-LABEL: test6d:
    753 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
    754 ; LINUX-KERNEL-X64: callq __stack_chk_fail
    755 
    756 ; DARWIN-X64-LABEL: test6d:
    757 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
    758 ; DARWIN-X64: callq ___stack_chk_fail
    759   %retval = alloca i32, align 4
    760   %a = alloca i32, align 4
    761   %j = alloca i32*, align 8
    762   store i32 0, i32* %retval
    763   %0 = load i32* %a, align 4
    764   %add = add nsw i32 %0, 1
    765   store i32 %add, i32* %a, align 4
    766   store i32* %a, i32** %j, align 8
    767   ret void
    768 }
    769 
    770 ; test7a:  PtrToInt Cast
    771 ;          no ssp attribute
    772 ; Requires no protector.
    773 define void @test7a() nounwind uwtable readnone {
    774 entry:
    775 ; LINUX-I386-LABEL: test7a:
    776 ; LINUX-I386-NOT: calll __stack_chk_fail
    777 ; LINUX-I386: .cfi_endproc
    778 
    779 ; LINUX-X64-LABEL: test7a:
    780 ; LINUX-X64-NOT: callq __stack_chk_fail
    781 ; LINUX-X64: .cfi_endproc
    782 
    783 ; LINUX-KERNEL-X64-LABEL: test7a:
    784 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
    785 ; LINUX-KERNEL-X64: .cfi_endproc
    786 
    787 ; DARWIN-X64-LABEL: test7a:
    788 ; DARWIN-X64-NOT: callq ___stack_chk_fail
    789 ; DARWIN-X64: .cfi_endproc
    790   %a = alloca i32, align 4
    791   %0 = ptrtoint i32* %a to i64
    792   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i64 %0)
    793   ret void
    794 }
    795 
    796 ; test7b:  PtrToInt Cast
    797 ;          ssp attribute
    798 ; Requires no protector.
    799 define void @test7b() nounwind uwtable readnone ssp {
    800 entry:
    801 ; LINUX-I386-LABEL: test7b:
    802 ; LINUX-I386-NOT: calll __stack_chk_fail
    803 ; LINUX-I386: .cfi_endproc
    804 
    805 ; LINUX-X64-LABEL: test7b:
    806 ; LINUX-X64-NOT: callq __stack_chk_fail
    807 ; LINUX-X64: .cfi_endproc
    808 
    809 ; LINUX-KERNEL-X64-LABEL: test7b:
    810 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
    811 ; LINUX-KERNEL-X64: .cfi_endproc
    812 
    813 ; DARWIN-X64-LABEL: test7b:
    814 ; DARWIN-X64-NOT: callq ___stack_chk_fail
    815 ; DARWIN-X64: .cfi_endproc
    816   %a = alloca i32, align 4
    817   %0 = ptrtoint i32* %a to i64
    818   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i64 %0)
    819   ret void
    820 }
    821 
    822 ; test7c:  PtrToInt Cast
    823 ;          sspstrong attribute
    824 ; Requires protector.
    825 define void @test7c() nounwind uwtable readnone sspstrong {
    826 entry:
    827 ; LINUX-I386-LABEL: test7c:
    828 ; LINUX-I386: mov{{l|q}} %gs:
    829 ; LINUX-I386: calll __stack_chk_fail
    830 
    831 ; LINUX-X64-LABEL: test7c:
    832 ; LINUX-X64: mov{{l|q}} %fs:
    833 ; LINUX-X64: callq __stack_chk_fail
    834 
    835 ; LINUX-KERNEL-X64-LABEL: test7c:
    836 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
    837 ; LINUX-KERNEL-X64: callq __stack_chk_fail
    838 
    839 ; DARWIN-X64-LABEL: test7c:
    840 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
    841 ; DARWIN-X64: callq ___stack_chk_fail
    842   %a = alloca i32, align 4
    843   %0 = ptrtoint i32* %a to i64
    844   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i64 %0)
    845   ret void
    846 }
    847 
    848 ; test7d:  PtrToInt Cast
    849 ;          sspreq attribute
    850 ; Requires protector.
    851 define void @test7d() nounwind uwtable readnone sspreq {
    852 entry:
    853 ; LINUX-I386-LABEL: test7d:
    854 ; LINUX-I386: mov{{l|q}} %gs:
    855 ; LINUX-I386: calll __stack_chk_fail
    856 
    857 ; LINUX-X64-LABEL: test7d:
    858 ; LINUX-X64: mov{{l|q}} %fs:
    859 ; LINUX-X64: callq __stack_chk_fail
    860 
    861 ; LINUX-KERNEL-X64-LABEL: test7d:
    862 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
    863 ; LINUX-KERNEL-X64: callq __stack_chk_fail
    864 
    865 ; DARWIN-X64-LABEL: test7d:
    866 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
    867 ; DARWIN-X64: callq ___stack_chk_fail
    868   %a = alloca i32, align 4
    869   %0 = ptrtoint i32* %a to i64
    870   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i64 %0)
    871   ret void
    872 }
    873 
    874 ; test8a:  Passing addr-of to function call
    875 ;          no ssp attribute
    876 ; Requires no protector.
    877 define void @test8a() nounwind uwtable {
    878 entry:
    879 ; LINUX-I386-LABEL: test8a:
    880 ; LINUX-I386-NOT: calll __stack_chk_fail
    881 ; LINUX-I386: .cfi_endproc
    882 
    883 ; LINUX-X64-LABEL: test8a:
    884 ; LINUX-X64-NOT: callq __stack_chk_fail
    885 ; LINUX-X64: .cfi_endproc
    886 
    887 ; LINUX-KERNEL-X64-LABEL: test8a:
    888 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
    889 ; LINUX-KERNEL-X64: .cfi_endproc
    890 
    891 ; DARWIN-X64-LABEL: test8a:
    892 ; DARWIN-X64-NOT: callq ___stack_chk_fail
    893 ; DARWIN-X64: .cfi_endproc
    894   %b = alloca i32, align 4
    895   call void @funcall(i32* %b) nounwind
    896   ret void
    897 }
    898 
    899 ; test8b:  Passing addr-of to function call
    900 ;          ssp attribute
    901 ; Requires no protector.
    902 define void @test8b() nounwind uwtable ssp {
    903 entry:
    904 ; LINUX-I386-LABEL: test8b:
    905 ; LINUX-I386-NOT: calll __stack_chk_fail
    906 ; LINUX-I386: .cfi_endproc
    907 
    908 ; LINUX-X64-LABEL: test8b:
    909 ; LINUX-X64-NOT: callq __stack_chk_fail
    910 ; LINUX-X64: .cfi_endproc
    911 
    912 ; LINUX-KERNEL-X64-LABEL: test8b:
    913 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
    914 ; LINUX-KERNEL-X64: .cfi_endproc
    915 
    916 ; DARWIN-X64-LABEL: test8b:
    917 ; DARWIN-X64-NOT: callq ___stack_chk_fail
    918 ; DARWIN-X64: .cfi_endproc
    919   %b = alloca i32, align 4
    920   call void @funcall(i32* %b) nounwind
    921   ret void
    922 }
    923 
    924 ; test8c:  Passing addr-of to function call
    925 ;          sspstrong attribute
    926 ; Requires protector.
    927 define void @test8c() nounwind uwtable sspstrong {
    928 entry:
    929 ; LINUX-I386-LABEL: test8c:
    930 ; LINUX-I386: mov{{l|q}} %gs:
    931 ; LINUX-I386: calll __stack_chk_fail
    932 
    933 ; LINUX-X64-LABEL: test8c:
    934 ; LINUX-X64: mov{{l|q}} %fs:
    935 ; LINUX-X64: callq __stack_chk_fail
    936 
    937 ; LINUX-KERNEL-X64-LABEL: test8c:
    938 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
    939 ; LINUX-KERNEL-X64: callq __stack_chk_fail
    940 
    941 ; DARWIN-X64-LABEL: test8c:
    942 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
    943 ; DARWIN-X64: callq ___stack_chk_fail
    944   %b = alloca i32, align 4
    945   call void @funcall(i32* %b) nounwind
    946   ret void
    947 }
    948 
    949 ; test8d:  Passing addr-of to function call
    950 ;          sspreq attribute
    951 ; Requires protector.
    952 define void @test8d() nounwind uwtable sspreq {
    953 entry:
    954 ; LINUX-I386-LABEL: test8d:
    955 ; LINUX-I386: mov{{l|q}} %gs:
    956 ; LINUX-I386: calll __stack_chk_fail
    957 
    958 ; LINUX-X64-LABEL: test8d:
    959 ; LINUX-X64: mov{{l|q}} %fs:
    960 ; LINUX-X64: callq __stack_chk_fail
    961 
    962 ; LINUX-KERNEL-X64-LABEL: test8d:
    963 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
    964 ; LINUX-KERNEL-X64: callq __stack_chk_fail
    965 
    966 ; DARWIN-X64-LABEL: test8d:
    967 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
    968 ; DARWIN-X64: callq ___stack_chk_fail
    969   %b = alloca i32, align 4
    970   call void @funcall(i32* %b) nounwind
    971   ret void
    972 }
    973 
    974 ; test9a:  Addr-of in select instruction
    975 ;          no ssp attribute
    976 ; Requires no protector.
    977 define void @test9a() nounwind uwtable {
    978 entry:
    979 ; LINUX-I386-LABEL: test9a:
    980 ; LINUX-I386-NOT: calll __stack_chk_fail
    981 ; LINUX-I386: .cfi_endproc
    982 
    983 ; LINUX-X64-LABEL: test9a:
    984 ; LINUX-X64-NOT: callq __stack_chk_fail
    985 ; LINUX-X64: .cfi_endproc
    986 
    987 ; LINUX-KERNEL-X64-LABEL: test9a:
    988 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
    989 ; LINUX-KERNEL-X64: .cfi_endproc
    990 
    991 ; DARWIN-X64-LABEL: test9a:
    992 ; DARWIN-X64-NOT: callq ___stack_chk_fail
    993 ; DARWIN-X64: .cfi_endproc
    994   %x = alloca double, align 8
    995   %call = call double @testi_aux() nounwind
    996   store double %call, double* %x, align 8
    997   %cmp2 = fcmp ogt double %call, 0.000000e+00
    998   %y.1 = select i1 %cmp2, double* %x, double* null
    999   %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), double* %y.1)
   1000   ret void
   1001 }
   1002 
   1003 ; test9b:  Addr-of in select instruction
   1004 ;          ssp attribute
   1005 ; Requires no protector.
   1006 define void @test9b() nounwind uwtable ssp {
   1007 entry:
   1008 ; LINUX-I386-LABEL: test9b:
   1009 ; LINUX-I386-NOT: calll __stack_chk_fail
   1010 ; LINUX-I386: .cfi_endproc
   1011 
   1012 ; LINUX-X64-LABEL: test9b:
   1013 ; LINUX-X64-NOT: callq __stack_chk_fail
   1014 ; LINUX-X64: .cfi_endproc
   1015 
   1016 ; LINUX-KERNEL-X64-LABEL: test9b:
   1017 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   1018 ; LINUX-KERNEL-X64: .cfi_endproc
   1019 
   1020 ; DARWIN-X64-LABEL: test9b:
   1021 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   1022 ; DARWIN-X64: .cfi_endproc
   1023   %x = alloca double, align 8
   1024   %call = call double @testi_aux() nounwind
   1025   store double %call, double* %x, align 8
   1026   %cmp2 = fcmp ogt double %call, 0.000000e+00
   1027   %y.1 = select i1 %cmp2, double* %x, double* null
   1028   %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), double* %y.1)
   1029   ret void
   1030 }
   1031 
   1032 ; test9c:  Addr-of in select instruction
   1033 ;          sspstrong attribute
   1034 ; Requires protector.
   1035 define void @test9c() nounwind uwtable sspstrong {
   1036 entry:
   1037 ; LINUX-I386-LABEL: test9c:
   1038 ; LINUX-I386: mov{{l|q}} %gs:
   1039 ; LINUX-I386: calll __stack_chk_fail
   1040 
   1041 ; LINUX-X64-LABEL: test9c:
   1042 ; LINUX-X64: mov{{l|q}} %fs:
   1043 ; LINUX-X64: callq __stack_chk_fail
   1044 
   1045 ; LINUX-KERNEL-X64-LABEL: test9c:
   1046 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   1047 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   1048 
   1049 ; DARWIN-X64-LABEL: test9c:
   1050 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   1051 ; DARWIN-X64: callq ___stack_chk_fail
   1052   %x = alloca double, align 8
   1053   %call = call double @testi_aux() nounwind
   1054   store double %call, double* %x, align 8
   1055   %cmp2 = fcmp ogt double %call, 0.000000e+00
   1056   %y.1 = select i1 %cmp2, double* %x, double* null
   1057   %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), double* %y.1)
   1058   ret void
   1059 }
   1060 
   1061 ; test9d:  Addr-of in select instruction
   1062 ;          sspreq attribute
   1063 ; Requires protector.
   1064 define void @test9d() nounwind uwtable sspreq {
   1065 entry:
   1066 ; LINUX-I386-LABEL: test9d:
   1067 ; LINUX-I386: mov{{l|q}} %gs:
   1068 ; LINUX-I386: calll __stack_chk_fail
   1069 
   1070 ; LINUX-X64-LABEL: test9d:
   1071 ; LINUX-X64: mov{{l|q}} %fs:
   1072 ; LINUX-X64: callq __stack_chk_fail
   1073 
   1074 ; LINUX-KERNEL-X64-LABEL: test9d:
   1075 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   1076 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   1077 
   1078 ; DARWIN-X64-LABEL: test9d:
   1079 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   1080 ; DARWIN-X64: callq ___stack_chk_fail
   1081   %x = alloca double, align 8
   1082   %call = call double @testi_aux() nounwind
   1083   store double %call, double* %x, align 8
   1084   %cmp2 = fcmp ogt double %call, 0.000000e+00
   1085   %y.1 = select i1 %cmp2, double* %x, double* null
   1086   %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), double* %y.1)
   1087   ret void
   1088 }
   1089 
   1090 ; test10a: Addr-of in phi instruction
   1091 ;          no ssp attribute
   1092 ; Requires no protector.
   1093 define void @test10a() nounwind uwtable {
   1094 entry:
   1095 ; LINUX-I386-LABEL: test10a:
   1096 ; LINUX-I386-NOT: calll __stack_chk_fail
   1097 ; LINUX-I386: .cfi_endproc
   1098 
   1099 ; LINUX-X64-LABEL: test10a:
   1100 ; LINUX-X64-NOT: callq __stack_chk_fail
   1101 ; LINUX-X64: .cfi_endproc
   1102 
   1103 ; LINUX-KERNEL-X64-LABEL: test10a:
   1104 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   1105 ; LINUX-KERNEL-X64: .cfi_endproc
   1106 
   1107 ; DARWIN-X64-LABEL: test10a:
   1108 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   1109 ; DARWIN-X64: .cfi_endproc
   1110   %x = alloca double, align 8
   1111   %call = call double @testi_aux() nounwind
   1112   store double %call, double* %x, align 8
   1113   %cmp = fcmp ogt double %call, 3.140000e+00
   1114   br i1 %cmp, label %if.then, label %if.else
   1115 
   1116 if.then:                                          ; preds = %entry
   1117   %call1 = call double @testi_aux() nounwind
   1118   store double %call1, double* %x, align 8
   1119   br label %if.end4
   1120 
   1121 if.else:                                          ; preds = %entry
   1122   %cmp2 = fcmp ogt double %call, 1.000000e+00
   1123   br i1 %cmp2, label %if.then3, label %if.end4
   1124 
   1125 if.then3:                                         ; preds = %if.else
   1126   br label %if.end4
   1127 
   1128 if.end4:                                          ; preds = %if.else, %if.then3, %if.then
   1129   %y.0 = phi double* [ null, %if.then ], [ %x, %if.then3 ], [ null, %if.else ]
   1130   %call5 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), double* %y.0) nounwind
   1131   ret void
   1132 }
   1133 
   1134 ; test10b: Addr-of in phi instruction
   1135 ;          ssp attribute
   1136 ; Requires no protector.
   1137 define void @test10b() nounwind uwtable ssp {
   1138 entry:
   1139 ; LINUX-I386-LABEL: test10b:
   1140 ; LINUX-I386-NOT: calll __stack_chk_fail
   1141 ; LINUX-I386: .cfi_endproc
   1142 
   1143 ; LINUX-X64-LABEL: test10b:
   1144 ; LINUX-X64-NOT: callq __stack_chk_fail
   1145 ; LINUX-X64: .cfi_endproc
   1146 
   1147 ; LINUX-KERNEL-X64-LABEL: test10b:
   1148 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   1149 ; LINUX-KERNEL-X64: .cfi_endproc
   1150 
   1151 ; DARWIN-X64-LABEL: test10b:
   1152 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   1153 ; DARWIN-X64: .cfi_endproc
   1154   %x = alloca double, align 8
   1155   %call = call double @testi_aux() nounwind
   1156   store double %call, double* %x, align 8
   1157   %cmp = fcmp ogt double %call, 3.140000e+00
   1158   br i1 %cmp, label %if.then, label %if.else
   1159 
   1160 if.then:                                          ; preds = %entry
   1161   %call1 = call double @testi_aux() nounwind
   1162   store double %call1, double* %x, align 8
   1163   br label %if.end4
   1164 
   1165 if.else:                                          ; preds = %entry
   1166   %cmp2 = fcmp ogt double %call, 1.000000e+00
   1167   br i1 %cmp2, label %if.then3, label %if.end4
   1168 
   1169 if.then3:                                         ; preds = %if.else
   1170   br label %if.end4
   1171 
   1172 if.end4:                                          ; preds = %if.else, %if.then3, %if.then
   1173   %y.0 = phi double* [ null, %if.then ], [ %x, %if.then3 ], [ null, %if.else ]
   1174   %call5 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), double* %y.0) nounwind
   1175   ret void
   1176 }
   1177 
   1178 ; test10c: Addr-of in phi instruction
   1179 ;          sspstrong attribute
   1180 ; Requires protector.
   1181 define void @test10c() nounwind uwtable sspstrong {
   1182 entry:
   1183 ; LINUX-I386-LABEL: test10c:
   1184 ; LINUX-I386: mov{{l|q}} %gs:
   1185 ; LINUX-I386: calll __stack_chk_fail
   1186 
   1187 ; LINUX-X64-LABEL: test10c:
   1188 ; LINUX-X64: mov{{l|q}} %fs:
   1189 ; LINUX-X64: callq __stack_chk_fail
   1190 
   1191 ; LINUX-KERNEL-X64-LABEL: test10c:
   1192 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   1193 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   1194 
   1195 ; DARWIN-X64-LABEL: test10c:
   1196 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   1197 ; DARWIN-X64: callq ___stack_chk_fail
   1198   %x = alloca double, align 8
   1199   %call = call double @testi_aux() nounwind
   1200   store double %call, double* %x, align 8
   1201   %cmp = fcmp ogt double %call, 3.140000e+00
   1202   br i1 %cmp, label %if.then, label %if.else
   1203 
   1204 if.then:                                          ; preds = %entry
   1205   %call1 = call double @testi_aux() nounwind
   1206   store double %call1, double* %x, align 8
   1207   br label %if.end4
   1208 
   1209 if.else:                                          ; preds = %entry
   1210   %cmp2 = fcmp ogt double %call, 1.000000e+00
   1211   br i1 %cmp2, label %if.then3, label %if.end4
   1212 
   1213 if.then3:                                         ; preds = %if.else
   1214   br label %if.end4
   1215 
   1216 if.end4:                                          ; preds = %if.else, %if.then3, %if.then
   1217   %y.0 = phi double* [ null, %if.then ], [ %x, %if.then3 ], [ null, %if.else ]
   1218   %call5 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), double* %y.0) nounwind
   1219   ret void
   1220 }
   1221 
   1222 ; test10d: Addr-of in phi instruction
   1223 ;          sspreq attribute
   1224 ; Requires protector.
   1225 define void @test10d() nounwind uwtable sspreq {
   1226 entry:
   1227 ; LINUX-I386-LABEL: test10d:
   1228 ; LINUX-I386: mov{{l|q}} %gs:
   1229 ; LINUX-I386: calll __stack_chk_fail
   1230 
   1231 ; LINUX-X64-LABEL: test10d:
   1232 ; LINUX-X64: mov{{l|q}} %fs:
   1233 ; LINUX-X64: callq __stack_chk_fail
   1234 
   1235 ; LINUX-KERNEL-X64-LABEL: test10d:
   1236 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   1237 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   1238 
   1239 ; DARWIN-X64-LABEL: test10d:
   1240 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   1241 ; DARWIN-X64: callq ___stack_chk_fail
   1242   %x = alloca double, align 8
   1243   %call = call double @testi_aux() nounwind
   1244   store double %call, double* %x, align 8
   1245   %cmp = fcmp ogt double %call, 3.140000e+00
   1246   br i1 %cmp, label %if.then, label %if.else
   1247 
   1248 if.then:                                          ; preds = %entry
   1249   %call1 = call double @testi_aux() nounwind
   1250   store double %call1, double* %x, align 8
   1251   br label %if.end4
   1252 
   1253 if.else:                                          ; preds = %entry
   1254   %cmp2 = fcmp ogt double %call, 1.000000e+00
   1255   br i1 %cmp2, label %if.then3, label %if.end4
   1256 
   1257 if.then3:                                         ; preds = %if.else
   1258   br label %if.end4
   1259 
   1260 if.end4:                                          ; preds = %if.else, %if.then3, %if.then
   1261   %y.0 = phi double* [ null, %if.then ], [ %x, %if.then3 ], [ null, %if.else ]
   1262   %call5 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), double* %y.0) nounwind
   1263   ret void
   1264 }
   1265 
   1266 ; test11a: Addr-of struct element. (GEP followed by store).
   1267 ;          no ssp attribute
   1268 ; Requires no protector.
   1269 define void @test11a() nounwind uwtable {
   1270 entry:
   1271 ; LINUX-I386-LABEL: test11a:
   1272 ; LINUX-I386-NOT: calll __stack_chk_fail
   1273 ; LINUX-I386: .cfi_endproc
   1274 
   1275 ; LINUX-X64-LABEL: test11a:
   1276 ; LINUX-X64-NOT: callq __stack_chk_fail
   1277 ; LINUX-X64: .cfi_endproc
   1278 
   1279 ; LINUX-KERNEL-X64-LABEL: test11a:
   1280 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   1281 ; LINUX-KERNEL-X64: .cfi_endproc
   1282 
   1283 ; DARWIN-X64-LABEL: test11a:
   1284 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   1285 ; DARWIN-X64: .cfi_endproc
   1286   %c = alloca %struct.pair, align 4
   1287   %b = alloca i32*, align 8
   1288   %y = getelementptr inbounds %struct.pair* %c, i32 0, i32 1
   1289   store i32* %y, i32** %b, align 8
   1290   %0 = load i32** %b, align 8
   1291   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i32* %0)
   1292   ret void
   1293 }
   1294 
   1295 ; test11b: Addr-of struct element. (GEP followed by store).
   1296 ;          ssp attribute
   1297 ; Requires no protector.
   1298 define void @test11b() nounwind uwtable ssp {
   1299 entry:
   1300 ; LINUX-I386-LABEL: test11b:
   1301 ; LINUX-I386-NOT: calll __stack_chk_fail
   1302 ; LINUX-I386: .cfi_endproc
   1303 
   1304 ; LINUX-X64-LABEL: test11b:
   1305 ; LINUX-X64-NOT: callq __stack_chk_fail
   1306 ; LINUX-X64: .cfi_endproc
   1307 
   1308 ; LINUX-KERNEL-X64-LABEL: test11b:
   1309 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   1310 ; LINUX-KERNEL-X64: .cfi_endproc
   1311 
   1312 ; DARWIN-X64-LABEL: test11b:
   1313 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   1314 ; DARWIN-X64: .cfi_endproc
   1315   %c = alloca %struct.pair, align 4
   1316   %b = alloca i32*, align 8
   1317   %y = getelementptr inbounds %struct.pair* %c, i32 0, i32 1
   1318   store i32* %y, i32** %b, align 8
   1319   %0 = load i32** %b, align 8
   1320   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i32* %0)
   1321   ret void
   1322 }
   1323 
   1324 ; test11c: Addr-of struct element. (GEP followed by store).
   1325 ;          sspstrong attribute
   1326 ; Requires protector.
   1327 define void @test11c() nounwind uwtable sspstrong {
   1328 entry:
   1329 ; LINUX-I386-LABEL: test11c:
   1330 ; LINUX-I386: mov{{l|q}} %gs:
   1331 ; LINUX-I386: calll __stack_chk_fail
   1332 
   1333 ; LINUX-X64-LABEL: test11c:
   1334 ; LINUX-X64: mov{{l|q}} %fs:
   1335 ; LINUX-X64: callq __stack_chk_fail
   1336 
   1337 ; LINUX-KERNEL-X64-LABEL: test11c:
   1338 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   1339 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   1340 
   1341 ; DARWIN-X64-LABEL: test11c:
   1342 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   1343 ; DARWIN-X64: callq ___stack_chk_fail
   1344   %c = alloca %struct.pair, align 4
   1345   %b = alloca i32*, align 8
   1346   %y = getelementptr inbounds %struct.pair* %c, i32 0, i32 1
   1347   store i32* %y, i32** %b, align 8
   1348   %0 = load i32** %b, align 8
   1349   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i32* %0)
   1350   ret void
   1351 }
   1352 
   1353 ; test11d: Addr-of struct element. (GEP followed by store).
   1354 ;          sspreq attribute
   1355 ; Requires protector.
   1356 define void @test11d() nounwind uwtable sspreq {
   1357 entry:
   1358 ; LINUX-I386-LABEL: test11d:
   1359 ; LINUX-I386: mov{{l|q}} %gs:
   1360 ; LINUX-I386: calll __stack_chk_fail
   1361 
   1362 ; LINUX-X64-LABEL: test11d:
   1363 ; LINUX-X64: mov{{l|q}} %fs:
   1364 ; LINUX-X64: callq __stack_chk_fail
   1365 
   1366 ; LINUX-KERNEL-X64-LABEL: test11d:
   1367 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   1368 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   1369 
   1370 ; DARWIN-X64-LABEL: test11d:
   1371 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   1372 ; DARWIN-X64: callq ___stack_chk_fail
   1373   %c = alloca %struct.pair, align 4
   1374   %b = alloca i32*, align 8
   1375   %y = getelementptr inbounds %struct.pair* %c, i32 0, i32 1
   1376   store i32* %y, i32** %b, align 8
   1377   %0 = load i32** %b, align 8
   1378   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i32* %0)
   1379   ret void
   1380 }
   1381 
   1382 ; test12a: Addr-of struct element, GEP followed by ptrtoint.
   1383 ;          no ssp attribute
   1384 ; Requires no protector.
   1385 define void @test12a() nounwind uwtable {
   1386 entry:
   1387 ; LINUX-I386-LABEL: test12a:
   1388 ; LINUX-I386-NOT: calll __stack_chk_fail
   1389 ; LINUX-I386: .cfi_endproc
   1390 
   1391 ; LINUX-X64-LABEL: test12a:
   1392 ; LINUX-X64-NOT: callq __stack_chk_fail
   1393 ; LINUX-X64: .cfi_endproc
   1394 
   1395 ; LINUX-KERNEL-X64-LABEL: test12a:
   1396 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   1397 ; LINUX-KERNEL-X64: .cfi_endproc
   1398 
   1399 ; DARWIN-X64-LABEL: test12a:
   1400 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   1401 ; DARWIN-X64: .cfi_endproc
   1402   %c = alloca %struct.pair, align 4
   1403   %b = alloca i32*, align 8
   1404   %y = getelementptr inbounds %struct.pair* %c, i32 0, i32 1
   1405   %0 = ptrtoint i32* %y to i64
   1406   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i64 %0)
   1407   ret void
   1408 }
   1409 
   1410 ; test12b: Addr-of struct element, GEP followed by ptrtoint.
   1411 ;          ssp attribute
   1412 ; Requires no protector.
   1413 define void @test12b() nounwind uwtable ssp {
   1414 entry:
   1415 ; LINUX-I386-LABEL: test12b:
   1416 ; LINUX-I386-NOT: calll __stack_chk_fail
   1417 ; LINUX-I386: .cfi_endproc
   1418 
   1419 ; LINUX-X64-LABEL: test12b:
   1420 ; LINUX-X64-NOT: callq __stack_chk_fail
   1421 ; LINUX-X64: .cfi_endproc
   1422 
   1423 ; LINUX-KERNEL-X64-LABEL: test12b:
   1424 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   1425 ; LINUX-KERNEL-X64: .cfi_endproc
   1426 
   1427 ; DARWIN-X64-LABEL: test12b:
   1428 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   1429 ; DARWIN-X64: .cfi_endproc
   1430   %c = alloca %struct.pair, align 4
   1431   %b = alloca i32*, align 8
   1432   %y = getelementptr inbounds %struct.pair* %c, i32 0, i32 1
   1433   %0 = ptrtoint i32* %y to i64
   1434   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i64 %0)
   1435   ret void
   1436 }
   1437 
   1438 ; test12c: Addr-of struct element, GEP followed by ptrtoint.
   1439 ;          sspstrong attribute
   1440 ; Requires protector.
   1441 define void @test12c() nounwind uwtable sspstrong {
   1442 entry:
   1443 ; LINUX-I386-LABEL: test12c:
   1444 ; LINUX-I386: mov{{l|q}} %gs:
   1445 ; LINUX-I386: calll __stack_chk_fail
   1446 
   1447 ; LINUX-X64-LABEL: test12c:
   1448 ; LINUX-X64: mov{{l|q}} %fs:
   1449 ; LINUX-X64: callq __stack_chk_fail
   1450 
   1451 ; LINUX-KERNEL-X64-LABEL: test12c:
   1452 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   1453 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   1454 
   1455 ; DARWIN-X64-LABEL: test12c:
   1456 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   1457 ; DARWIN-X64: callq ___stack_chk_fail
   1458   %c = alloca %struct.pair, align 4
   1459   %b = alloca i32*, align 8
   1460   %y = getelementptr inbounds %struct.pair* %c, i32 0, i32 1
   1461   %0 = ptrtoint i32* %y to i64
   1462   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i64 %0)
   1463   ret void
   1464 }
   1465 
   1466 ; test12d: Addr-of struct element, GEP followed by ptrtoint.
   1467 ;          sspreq attribute
   1468 ; Requires protector.
   1469 define void @test12d() nounwind uwtable sspreq {
   1470 entry:
   1471 ; LINUX-I386-LABEL: test12d:
   1472 ; LINUX-I386: mov{{l|q}} %gs:
   1473 ; LINUX-I386: calll __stack_chk_fail
   1474 
   1475 ; LINUX-X64-LABEL: test12d:
   1476 ; LINUX-X64: mov{{l|q}} %fs:
   1477 ; LINUX-X64: callq __stack_chk_fail
   1478 
   1479 ; LINUX-KERNEL-X64-LABEL: test12d:
   1480 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   1481 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   1482 
   1483 ; DARWIN-X64-LABEL: test12d:
   1484 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   1485 ; DARWIN-X64: callq ___stack_chk_fail
   1486   %c = alloca %struct.pair, align 4
   1487   %b = alloca i32*, align 8
   1488   %y = getelementptr inbounds %struct.pair* %c, i32 0, i32 1
   1489   %0 = ptrtoint i32* %y to i64
   1490   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i64 %0)
   1491   ret void
   1492 }
   1493 
   1494 ; test13a: Addr-of struct element, GEP followed by callinst.
   1495 ;          no ssp attribute
   1496 ; Requires no protector.
   1497 define void @test13a() nounwind uwtable {
   1498 entry:
   1499 ; LINUX-I386-LABEL: test13a:
   1500 ; LINUX-I386-NOT: calll __stack_chk_fail
   1501 ; LINUX-I386: .cfi_endproc
   1502 
   1503 ; LINUX-X64-LABEL: test13a:
   1504 ; LINUX-X64-NOT: callq __stack_chk_fail
   1505 ; LINUX-X64: .cfi_endproc
   1506 
   1507 ; LINUX-KERNEL-X64-LABEL: test13a:
   1508 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   1509 ; LINUX-KERNEL-X64: .cfi_endproc
   1510 
   1511 ; DARWIN-X64-LABEL: test13a:
   1512 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   1513 ; DARWIN-X64: .cfi_endproc
   1514   %c = alloca %struct.pair, align 4
   1515   %y = getelementptr inbounds %struct.pair* %c, i64 0, i32 1
   1516   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32* %y) nounwind
   1517   ret void
   1518 }
   1519 
   1520 ; test13b: Addr-of struct element, GEP followed by callinst.
   1521 ;          ssp attribute
   1522 ; Requires no protector.
   1523 define void @test13b() nounwind uwtable ssp {
   1524 entry:
   1525 ; LINUX-I386-LABEL: test13b:
   1526 ; LINUX-I386-NOT: calll __stack_chk_fail
   1527 ; LINUX-I386: .cfi_endproc
   1528 
   1529 ; LINUX-X64-LABEL: test13b:
   1530 ; LINUX-X64-NOT: callq __stack_chk_fail
   1531 ; LINUX-X64: .cfi_endproc
   1532 
   1533 ; LINUX-KERNEL-X64-LABEL: test13b:
   1534 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   1535 ; LINUX-KERNEL-X64: .cfi_endproc
   1536 
   1537 ; DARWIN-X64-LABEL: test13b:
   1538 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   1539 ; DARWIN-X64: .cfi_endproc
   1540   %c = alloca %struct.pair, align 4
   1541   %y = getelementptr inbounds %struct.pair* %c, i64 0, i32 1
   1542   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32* %y) nounwind
   1543   ret void
   1544 }
   1545 
   1546 ; test13c: Addr-of struct element, GEP followed by callinst.
   1547 ;          sspstrong attribute
   1548 ; Requires protector.
   1549 define void @test13c() nounwind uwtable sspstrong {
   1550 entry:
   1551 ; LINUX-I386-LABEL: test13c:
   1552 ; LINUX-I386: mov{{l|q}} %gs:
   1553 ; LINUX-I386: calll __stack_chk_fail
   1554 
   1555 ; LINUX-X64-LABEL: test13c:
   1556 ; LINUX-X64: mov{{l|q}} %fs:
   1557 ; LINUX-X64: callq __stack_chk_fail
   1558 
   1559 ; LINUX-KERNEL-X64-LABEL: test13c:
   1560 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   1561 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   1562 
   1563 ; DARWIN-X64-LABEL: test13c:
   1564 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   1565 ; DARWIN-X64: callq ___stack_chk_fail
   1566   %c = alloca %struct.pair, align 4
   1567   %y = getelementptr inbounds %struct.pair* %c, i64 0, i32 1
   1568   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32* %y) nounwind
   1569   ret void
   1570 }
   1571 
   1572 ; test13d: Addr-of struct element, GEP followed by callinst.
   1573 ;          sspreq attribute
   1574 ; Requires protector.
   1575 define void @test13d() nounwind uwtable sspreq {
   1576 entry:
   1577 ; LINUX-I386-LABEL: test13d:
   1578 ; LINUX-I386: mov{{l|q}} %gs:
   1579 ; LINUX-I386: calll __stack_chk_fail
   1580 
   1581 ; LINUX-X64-LABEL: test13d:
   1582 ; LINUX-X64: mov{{l|q}} %fs:
   1583 ; LINUX-X64: callq __stack_chk_fail
   1584 
   1585 ; LINUX-KERNEL-X64-LABEL: test13d:
   1586 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   1587 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   1588 
   1589 ; DARWIN-X64-LABEL: test13d:
   1590 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   1591 ; DARWIN-X64: callq ___stack_chk_fail
   1592   %c = alloca %struct.pair, align 4
   1593   %y = getelementptr inbounds %struct.pair* %c, i64 0, i32 1
   1594   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32* %y) nounwind
   1595   ret void
   1596 }
   1597 
   1598 ; test14a: Addr-of a local, optimized into a GEP (e.g., &a - 12)
   1599 ;          no ssp attribute
   1600 ; Requires no protector.
   1601 define void @test14a() nounwind uwtable {
   1602 entry:
   1603 ; LINUX-I386-LABEL: test14a:
   1604 ; LINUX-I386-NOT: calll __stack_chk_fail
   1605 ; LINUX-I386: .cfi_endproc
   1606 
   1607 ; LINUX-X64-LABEL: test14a:
   1608 ; LINUX-X64-NOT: callq __stack_chk_fail
   1609 ; LINUX-X64: .cfi_endproc
   1610 
   1611 ; LINUX-KERNEL-X64-LABEL: test14a:
   1612 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   1613 ; LINUX-KERNEL-X64: .cfi_endproc
   1614 
   1615 ; DARWIN-X64-LABEL: test14a:
   1616 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   1617 ; DARWIN-X64: .cfi_endproc
   1618   %a = alloca i32, align 4
   1619   %add.ptr5 = getelementptr inbounds i32* %a, i64 -12
   1620   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32* %add.ptr5) nounwind
   1621   ret void
   1622 }
   1623 
   1624 ; test14b: Addr-of a local, optimized into a GEP (e.g., &a - 12)
   1625 ;          ssp attribute
   1626 ; Requires no protector.
   1627 define void @test14b() nounwind uwtable ssp {
   1628 entry:
   1629 ; LINUX-I386-LABEL: test14b:
   1630 ; LINUX-I386-NOT: calll __stack_chk_fail
   1631 ; LINUX-I386: .cfi_endproc
   1632 
   1633 ; LINUX-X64-LABEL: test14b:
   1634 ; LINUX-X64-NOT: callq __stack_chk_fail
   1635 ; LINUX-X64: .cfi_endproc
   1636 
   1637 ; LINUX-KERNEL-X64-LABEL: test14b:
   1638 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   1639 ; LINUX-KERNEL-X64: .cfi_endproc
   1640 
   1641 ; DARWIN-X64-LABEL: test14b:
   1642 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   1643 ; DARWIN-X64: .cfi_endproc
   1644   %a = alloca i32, align 4
   1645   %add.ptr5 = getelementptr inbounds i32* %a, i64 -12
   1646   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32* %add.ptr5) nounwind
   1647   ret void
   1648 }
   1649 
   1650 ; test14c: Addr-of a local, optimized into a GEP (e.g., &a - 12)
   1651 ;          sspstrong attribute
   1652 ; Requires protector.
   1653 define void @test14c() nounwind uwtable sspstrong {
   1654 entry:
   1655 ; LINUX-I386-LABEL: test14c:
   1656 ; LINUX-I386: mov{{l|q}} %gs:
   1657 ; LINUX-I386: calll __stack_chk_fail
   1658 
   1659 ; LINUX-X64-LABEL: test14c:
   1660 ; LINUX-X64: mov{{l|q}} %fs:
   1661 ; LINUX-X64: callq __stack_chk_fail
   1662 
   1663 ; LINUX-KERNEL-X64-LABEL: test14c:
   1664 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   1665 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   1666 
   1667 ; DARWIN-X64-LABEL: test14c:
   1668 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   1669 ; DARWIN-X64: callq ___stack_chk_fail
   1670   %a = alloca i32, align 4
   1671   %add.ptr5 = getelementptr inbounds i32* %a, i64 -12
   1672   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32* %add.ptr5) nounwind
   1673   ret void
   1674 }
   1675 
   1676 ; test14d: Addr-of a local, optimized into a GEP (e.g., &a - 12)
   1677 ;          sspreq  attribute
   1678 ; Requires protector.
   1679 define void @test14d() nounwind uwtable sspreq {
   1680 entry:
   1681 ; LINUX-I386-LABEL: test14d:
   1682 ; LINUX-I386: mov{{l|q}} %gs:
   1683 ; LINUX-I386: calll __stack_chk_fail
   1684 
   1685 ; LINUX-X64-LABEL: test14d:
   1686 ; LINUX-X64: mov{{l|q}} %fs:
   1687 ; LINUX-X64: callq __stack_chk_fail
   1688 
   1689 ; LINUX-KERNEL-X64-LABEL: test14d:
   1690 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   1691 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   1692 
   1693 ; DARWIN-X64-LABEL: test14d:
   1694 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   1695 ; DARWIN-X64: callq ___stack_chk_fail
   1696   %a = alloca i32, align 4
   1697   %add.ptr5 = getelementptr inbounds i32* %a, i64 -12
   1698   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32* %add.ptr5) nounwind
   1699   ret void
   1700 }
   1701 
   1702 ; test15a: Addr-of a local cast to a ptr of a different type
   1703 ;           (e.g., int a; ... ; float *b = &a;)
   1704 ;          no ssp attribute
   1705 ; Requires no protector.
   1706 define void @test15a() nounwind uwtable {
   1707 entry:
   1708 ; LINUX-I386-LABEL: test15a:
   1709 ; LINUX-I386-NOT: calll __stack_chk_fail
   1710 ; LINUX-I386: .cfi_endproc
   1711 
   1712 ; LINUX-X64-LABEL: test15a:
   1713 ; LINUX-X64-NOT: callq __stack_chk_fail
   1714 ; LINUX-X64: .cfi_endproc
   1715 
   1716 ; LINUX-KERNEL-X64-LABEL: test15a:
   1717 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   1718 ; LINUX-KERNEL-X64: .cfi_endproc
   1719 
   1720 ; DARWIN-X64-LABEL: test15a:
   1721 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   1722 ; DARWIN-X64: .cfi_endproc
   1723   %a = alloca i32, align 4
   1724   %b = alloca float*, align 8
   1725   store i32 0, i32* %a, align 4
   1726   %0 = bitcast i32* %a to float*
   1727   store float* %0, float** %b, align 8
   1728   %1 = load float** %b, align 8
   1729   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), float* %1)
   1730   ret void
   1731 }
   1732 
   1733 ; test15b: Addr-of a local cast to a ptr of a different type
   1734 ;           (e.g., int a; ... ; float *b = &a;)
   1735 ;          ssp attribute
   1736 ; Requires no protector.
   1737 define void @test15b() nounwind uwtable ssp {
   1738 entry:
   1739 ; LINUX-I386-LABEL: test15b:
   1740 ; LINUX-I386-NOT: calll __stack_chk_fail
   1741 ; LINUX-I386: .cfi_endproc
   1742 
   1743 ; LINUX-X64-LABEL: test15b:
   1744 ; LINUX-X64-NOT: callq __stack_chk_fail
   1745 ; LINUX-X64: .cfi_endproc
   1746 
   1747 ; LINUX-KERNEL-X64-LABEL: test15b:
   1748 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   1749 ; LINUX-KERNEL-X64: .cfi_endproc
   1750 
   1751 ; DARWIN-X64-LABEL: test15b:
   1752 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   1753 ; DARWIN-X64: .cfi_endproc
   1754   %a = alloca i32, align 4
   1755   %b = alloca float*, align 8
   1756   store i32 0, i32* %a, align 4
   1757   %0 = bitcast i32* %a to float*
   1758   store float* %0, float** %b, align 8
   1759   %1 = load float** %b, align 8
   1760   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), float* %1)
   1761   ret void
   1762 }
   1763 
   1764 ; test15c: Addr-of a local cast to a ptr of a different type
   1765 ;           (e.g., int a; ... ; float *b = &a;)
   1766 ;          sspstrong attribute
   1767 ; Requires protector.
   1768 define void @test15c() nounwind uwtable sspstrong {
   1769 entry:
   1770 ; LINUX-I386-LABEL: test15c:
   1771 ; LINUX-I386: mov{{l|q}} %gs:
   1772 ; LINUX-I386: calll __stack_chk_fail
   1773 
   1774 ; LINUX-X64-LABEL: test15c:
   1775 ; LINUX-X64: mov{{l|q}} %fs:
   1776 ; LINUX-X64: callq __stack_chk_fail
   1777 
   1778 ; LINUX-KERNEL-X64-LABEL: test15c:
   1779 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   1780 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   1781 
   1782 ; DARWIN-X64-LABEL: test15c:
   1783 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   1784 ; DARWIN-X64: callq ___stack_chk_fail
   1785   %a = alloca i32, align 4
   1786   %b = alloca float*, align 8
   1787   store i32 0, i32* %a, align 4
   1788   %0 = bitcast i32* %a to float*
   1789   store float* %0, float** %b, align 8
   1790   %1 = load float** %b, align 8
   1791   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), float* %1)
   1792   ret void
   1793 }
   1794 
   1795 ; test15d: Addr-of a local cast to a ptr of a different type
   1796 ;           (e.g., int a; ... ; float *b = &a;)
   1797 ;          sspreq attribute
   1798 ; Requires protector.
   1799 define void @test15d() nounwind uwtable sspreq {
   1800 entry:
   1801 ; LINUX-I386-LABEL: test15d:
   1802 ; LINUX-I386: mov{{l|q}} %gs:
   1803 ; LINUX-I386: calll __stack_chk_fail
   1804 
   1805 ; LINUX-X64-LABEL: test15d:
   1806 ; LINUX-X64: mov{{l|q}} %fs:
   1807 ; LINUX-X64: callq __stack_chk_fail
   1808 
   1809 ; LINUX-KERNEL-X64-LABEL: test15d:
   1810 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   1811 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   1812 
   1813 ; DARWIN-X64-LABEL: test15d:
   1814 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   1815 ; DARWIN-X64: callq ___stack_chk_fail
   1816   %a = alloca i32, align 4
   1817   %b = alloca float*, align 8
   1818   store i32 0, i32* %a, align 4
   1819   %0 = bitcast i32* %a to float*
   1820   store float* %0, float** %b, align 8
   1821   %1 = load float** %b, align 8
   1822   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), float* %1)
   1823   ret void
   1824 }
   1825 
   1826 ; test16a: Addr-of a local cast to a ptr of a different type (optimized)
   1827 ;           (e.g., int a; ... ; float *b = &a;)
   1828 ;          no ssp attribute
   1829 ; Requires no protector.
   1830 define void @test16a() nounwind uwtable {
   1831 entry:
   1832 ; LINUX-I386-LABEL: test16a:
   1833 ; LINUX-I386-NOT: calll __stack_chk_fail
   1834 ; LINUX-I386: .cfi_endproc
   1835 
   1836 ; LINUX-X64-LABEL: test16a:
   1837 ; LINUX-X64-NOT: callq __stack_chk_fail
   1838 ; LINUX-X64: .cfi_endproc
   1839 
   1840 ; LINUX-KERNEL-X64-LABEL: test16a:
   1841 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   1842 ; LINUX-KERNEL-X64: .cfi_endproc
   1843 
   1844 ; DARWIN-X64-LABEL: test16a:
   1845 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   1846 ; DARWIN-X64: .cfi_endproc
   1847   %a = alloca i32, align 4
   1848   store i32 0, i32* %a, align 4
   1849   %0 = bitcast i32* %a to float*
   1850   call void @funfloat(float* %0) nounwind
   1851   ret void
   1852 }
   1853 
   1854 ; test16b: Addr-of a local cast to a ptr of a different type (optimized)
   1855 ;           (e.g., int a; ... ; float *b = &a;)
   1856 ;          ssp attribute
   1857 ; Requires no protector.
   1858 define void @test16b() nounwind uwtable ssp {
   1859 entry:
   1860 ; LINUX-I386-LABEL: test16b:
   1861 ; LINUX-I386-NOT: calll __stack_chk_fail
   1862 ; LINUX-I386: .cfi_endproc
   1863 
   1864 ; LINUX-X64-LABEL: test16b:
   1865 ; LINUX-X64-NOT: callq __stack_chk_fail
   1866 ; LINUX-X64: .cfi_endproc
   1867 
   1868 ; LINUX-KERNEL-X64-LABEL: test16b:
   1869 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   1870 ; LINUX-KERNEL-X64: .cfi_endproc
   1871 
   1872 ; DARWIN-X64-LABEL: test16b:
   1873 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   1874 ; DARWIN-X64: .cfi_endproc
   1875   %a = alloca i32, align 4
   1876   store i32 0, i32* %a, align 4
   1877   %0 = bitcast i32* %a to float*
   1878   call void @funfloat(float* %0) nounwind
   1879   ret void
   1880 }
   1881 
   1882 ; test16c: Addr-of a local cast to a ptr of a different type (optimized)
   1883 ;           (e.g., int a; ... ; float *b = &a;)
   1884 ;          sspstrong attribute
   1885 ; Requires protector.
   1886 define void @test16c() nounwind uwtable sspstrong {
   1887 entry:
   1888 ; LINUX-I386-LABEL: test16c:
   1889 ; LINUX-I386: mov{{l|q}} %gs:
   1890 ; LINUX-I386: calll __stack_chk_fail
   1891 
   1892 ; LINUX-X64-LABEL: test16c:
   1893 ; LINUX-X64: mov{{l|q}} %fs:
   1894 ; LINUX-X64: callq __stack_chk_fail
   1895 
   1896 ; LINUX-KERNEL-X64-LABEL: test16c:
   1897 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   1898 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   1899 
   1900 ; DARWIN-X64-LABEL: test16c:
   1901 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   1902 ; DARWIN-X64: callq ___stack_chk_fail
   1903   %a = alloca i32, align 4
   1904   store i32 0, i32* %a, align 4
   1905   %0 = bitcast i32* %a to float*
   1906   call void @funfloat(float* %0) nounwind
   1907   ret void
   1908 }
   1909 
   1910 ; test16d: Addr-of a local cast to a ptr of a different type (optimized)
   1911 ;           (e.g., int a; ... ; float *b = &a;)
   1912 ;          sspreq attribute
   1913 ; Requires protector.
   1914 define void @test16d() nounwind uwtable sspreq {
   1915 entry:
   1916 ; LINUX-I386-LABEL: test16d:
   1917 ; LINUX-I386: mov{{l|q}} %gs:
   1918 ; LINUX-I386: calll __stack_chk_fail
   1919 
   1920 ; LINUX-X64-LABEL: test16d:
   1921 ; LINUX-X64: mov{{l|q}} %fs:
   1922 ; LINUX-X64: callq __stack_chk_fail
   1923 
   1924 ; LINUX-KERNEL-X64-LABEL: test16d:
   1925 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   1926 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   1927 
   1928 ; DARWIN-X64-LABEL: test16d:
   1929 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   1930 ; DARWIN-X64: callq ___stack_chk_fail
   1931   %a = alloca i32, align 4
   1932   store i32 0, i32* %a, align 4
   1933   %0 = bitcast i32* %a to float*
   1934   call void @funfloat(float* %0) nounwind
   1935   ret void
   1936 }
   1937 
   1938 ; test17a: Addr-of a vector nested in a struct
   1939 ;          no ssp attribute
   1940 ; Requires no protector.
   1941 define void @test17a() nounwind uwtable {
   1942 entry:
   1943 ; LINUX-I386-LABEL: test17a:
   1944 ; LINUX-I386-NOT: calll __stack_chk_fail
   1945 ; LINUX-I386: .cfi_endproc
   1946 
   1947 ; LINUX-X64-LABEL: test17a:
   1948 ; LINUX-X64-NOT: callq __stack_chk_fail
   1949 ; LINUX-X64: .cfi_endproc
   1950 
   1951 ; LINUX-KERNEL-X64-LABEL: test17a:
   1952 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   1953 ; LINUX-KERNEL-X64: .cfi_endproc
   1954 
   1955 ; DARWIN-X64-LABEL: test17a:
   1956 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   1957 ; DARWIN-X64: .cfi_endproc
   1958   %c = alloca %struct.vec, align 16
   1959   %y = getelementptr inbounds %struct.vec* %c, i64 0, i32 0
   1960   %add.ptr = getelementptr inbounds <4 x i32>* %y, i64 -12
   1961   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), <4 x i32>* %add.ptr) nounwind
   1962   ret void
   1963 }
   1964 
   1965 ; test17b: Addr-of a vector nested in a struct
   1966 ;          ssp attribute
   1967 ; Requires no protector.
   1968 define void @test17b() nounwind uwtable ssp {
   1969 entry:
   1970 ; LINUX-I386-LABEL: test17b:
   1971 ; LINUX-I386-NOT: calll __stack_chk_fail
   1972 ; LINUX-I386: .cfi_endproc
   1973 
   1974 ; LINUX-X64-LABEL: test17b:
   1975 ; LINUX-X64-NOT: callq __stack_chk_fail
   1976 ; LINUX-X64: .cfi_endproc
   1977 
   1978 ; LINUX-KERNEL-X64-LABEL: test17b:
   1979 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   1980 ; LINUX-KERNEL-X64: .cfi_endproc
   1981 
   1982 ; DARWIN-X64-LABEL: test17b:
   1983 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   1984 ; DARWIN-X64: .cfi_endproc
   1985   %c = alloca %struct.vec, align 16
   1986   %y = getelementptr inbounds %struct.vec* %c, i64 0, i32 0
   1987   %add.ptr = getelementptr inbounds <4 x i32>* %y, i64 -12
   1988   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), <4 x i32>* %add.ptr) nounwind
   1989   ret void
   1990 }
   1991 
   1992 ; test17c: Addr-of a vector nested in a struct
   1993 ;          sspstrong attribute
   1994 ; Requires protector.
   1995 define void @test17c() nounwind uwtable sspstrong {
   1996 entry:
   1997 ; LINUX-I386-LABEL: test17c:
   1998 ; LINUX-I386: mov{{l|q}} %gs:
   1999 ; LINUX-I386: calll __stack_chk_fail
   2000 
   2001 ; LINUX-X64-LABEL: test17c:
   2002 ; LINUX-X64: mov{{l|q}} %fs:
   2003 ; LINUX-X64: callq __stack_chk_fail
   2004 
   2005 ; LINUX-KERNEL-X64-LABEL: test17c:
   2006 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   2007 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   2008 
   2009 ; DARWIN-X64-LABEL: test17c:
   2010 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   2011 ; DARWIN-X64: callq ___stack_chk_fail
   2012   %c = alloca %struct.vec, align 16
   2013   %y = getelementptr inbounds %struct.vec* %c, i64 0, i32 0
   2014   %add.ptr = getelementptr inbounds <4 x i32>* %y, i64 -12
   2015   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), <4 x i32>* %add.ptr) nounwind
   2016   ret void
   2017 }
   2018 
   2019 ; test17d: Addr-of a vector nested in a struct
   2020 ;          sspreq attribute
   2021 ; Requires protector.
   2022 define void @test17d() nounwind uwtable sspreq {
   2023 entry:
   2024 ; LINUX-I386-LABEL: test17d:
   2025 ; LINUX-I386: mov{{l|q}} %gs:
   2026 ; LINUX-I386: calll __stack_chk_fail
   2027 
   2028 ; LINUX-X64-LABEL: test17d:
   2029 ; LINUX-X64: mov{{l|q}} %fs:
   2030 ; LINUX-X64: callq __stack_chk_fail
   2031 
   2032 ; LINUX-KERNEL-X64-LABEL: test17d:
   2033 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   2034 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   2035 
   2036 ; DARWIN-X64-LABEL: test17d:
   2037 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   2038 ; DARWIN-X64: callq ___stack_chk_fail
   2039   %c = alloca %struct.vec, align 16
   2040   %y = getelementptr inbounds %struct.vec* %c, i64 0, i32 0
   2041   %add.ptr = getelementptr inbounds <4 x i32>* %y, i64 -12
   2042   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), <4 x i32>* %add.ptr) nounwind
   2043   ret void
   2044 }
   2045 
   2046 ; test18a: Addr-of a variable passed into an invoke instruction.
   2047 ;          no ssp attribute
   2048 ; Requires no protector.
   2049 define i32 @test18a() uwtable {
   2050 entry:
   2051 ; LINUX-I386-LABEL: test18a:
   2052 ; LINUX-I386-NOT: calll __stack_chk_fail
   2053 ; LINUX-I386: .cfi_endproc
   2054 
   2055 ; LINUX-X64-LABEL: test18a:
   2056 ; LINUX-X64-NOT: callq __stack_chk_fail
   2057 ; LINUX-X64: .cfi_endproc
   2058 
   2059 ; LINUX-KERNEL-X64-LABEL: test18a:
   2060 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   2061 ; LINUX-KERNEL-X64: .cfi_endproc
   2062 
   2063 ; DARWIN-X64-LABEL: test18a:
   2064 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   2065 ; DARWIN-X64: .cfi_endproc
   2066   %a = alloca i32, align 4
   2067   %exn.slot = alloca i8*
   2068   %ehselector.slot = alloca i32
   2069   store i32 0, i32* %a, align 4
   2070   invoke void @_Z3exceptPi(i32* %a)
   2071           to label %invoke.cont unwind label %lpad
   2072 
   2073 invoke.cont:
   2074   ret i32 0
   2075 
   2076 lpad:
   2077   %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
   2078           catch i8* null
   2079   ret i32 0
   2080 }
   2081 
   2082 ; test18b: Addr-of a variable passed into an invoke instruction.
   2083 ;          ssp attribute
   2084 ; Requires no protector.
   2085 define i32 @test18b() uwtable ssp {
   2086 entry:
   2087 ; LINUX-I386-LABEL: test18b:
   2088 ; LINUX-I386-NOT: calll __stack_chk_fail
   2089 ; LINUX-I386: .cfi_endproc
   2090 
   2091 ; LINUX-X64-LABEL: test18b:
   2092 ; LINUX-X64-NOT: callq __stack_chk_fail
   2093 ; LINUX-X64: .cfi_endproc
   2094 
   2095 ; LINUX-KERNEL-X64-LABEL: test18b:
   2096 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   2097 ; LINUX-KERNEL-X64: .cfi_endproc
   2098 
   2099 ; DARWIN-X64-LABEL: test18b:
   2100 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   2101 ; DARWIN-X64: .cfi_endproc
   2102   %a = alloca i32, align 4
   2103   %exn.slot = alloca i8*
   2104   %ehselector.slot = alloca i32
   2105   store i32 0, i32* %a, align 4
   2106   invoke void @_Z3exceptPi(i32* %a)
   2107           to label %invoke.cont unwind label %lpad
   2108 
   2109 invoke.cont:
   2110   ret i32 0
   2111 
   2112 lpad:
   2113   %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
   2114           catch i8* null
   2115   ret i32 0
   2116 }
   2117 
   2118 ; test18c: Addr-of a variable passed into an invoke instruction.
   2119 ;          sspstrong attribute
   2120 ; Requires protector.
   2121 define i32 @test18c() uwtable sspstrong {
   2122 entry:
   2123 ; LINUX-I386-LABEL: test18c:
   2124 ; LINUX-I386: mov{{l|q}} %gs:
   2125 ; LINUX-I386: calll __stack_chk_fail
   2126 
   2127 ; LINUX-X64-LABEL: test18c:
   2128 ; LINUX-X64: mov{{l|q}} %fs:
   2129 ; LINUX-X64: callq __stack_chk_fail
   2130 
   2131 ; LINUX-KERNEL-X64-LABEL: test18c:
   2132 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   2133 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   2134 
   2135 ; DARWIN-X64-LABEL: test18c:
   2136 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   2137 ; DARWIN-X64: callq ___stack_chk_fail
   2138   %a = alloca i32, align 4
   2139   %exn.slot = alloca i8*
   2140   %ehselector.slot = alloca i32
   2141   store i32 0, i32* %a, align 4
   2142   invoke void @_Z3exceptPi(i32* %a)
   2143           to label %invoke.cont unwind label %lpad
   2144 
   2145 invoke.cont:
   2146   ret i32 0
   2147 
   2148 lpad:
   2149   %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
   2150           catch i8* null
   2151   ret i32 0
   2152 }
   2153 
   2154 ; test18d: Addr-of a variable passed into an invoke instruction.
   2155 ;          sspreq attribute
   2156 ; Requires protector.
   2157 define i32 @test18d() uwtable sspreq {
   2158 entry:
   2159 ; LINUX-I386-LABEL: test18d:
   2160 ; LINUX-I386: mov{{l|q}} %gs:
   2161 ; LINUX-I386: calll __stack_chk_fail
   2162 
   2163 ; LINUX-X64-LABEL: test18d:
   2164 ; LINUX-X64: mov{{l|q}} %fs:
   2165 ; LINUX-X64: callq __stack_chk_fail
   2166 
   2167 ; LINUX-KERNEL-X64-LABEL: test18d:
   2168 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   2169 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   2170 
   2171 ; DARWIN-X64-LABEL: test18d:
   2172 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   2173 ; DARWIN-X64: callq ___stack_chk_fail
   2174   %a = alloca i32, align 4
   2175   %exn.slot = alloca i8*
   2176   %ehselector.slot = alloca i32
   2177   store i32 0, i32* %a, align 4
   2178   invoke void @_Z3exceptPi(i32* %a)
   2179           to label %invoke.cont unwind label %lpad
   2180 
   2181 invoke.cont:
   2182   ret i32 0
   2183 
   2184 lpad:
   2185   %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
   2186           catch i8* null
   2187   ret i32 0
   2188 }
   2189 
   2190 ; test19a: Addr-of a struct element passed into an invoke instruction.
   2191 ;           (GEP followed by an invoke)
   2192 ;          no ssp attribute
   2193 ; Requires no protector.
   2194 define i32 @test19a() uwtable {
   2195 entry:
   2196 ; LINUX-I386-LABEL: test19a:
   2197 ; LINUX-I386-NOT: calll __stack_chk_fail
   2198 ; LINUX-I386: .cfi_endproc
   2199 
   2200 ; LINUX-X64-LABEL: test19a:
   2201 ; LINUX-X64-NOT: callq __stack_chk_fail
   2202 ; LINUX-X64: .cfi_endproc
   2203 
   2204 ; LINUX-KERNEL-X64-LABEL: test19a:
   2205 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   2206 ; LINUX-KERNEL-X64: .cfi_endproc
   2207 
   2208 ; DARWIN-X64-LABEL: test19a:
   2209 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   2210 ; DARWIN-X64: .cfi_endproc
   2211   %c = alloca %struct.pair, align 4
   2212   %exn.slot = alloca i8*
   2213   %ehselector.slot = alloca i32
   2214   %a = getelementptr inbounds %struct.pair* %c, i32 0, i32 0
   2215   store i32 0, i32* %a, align 4
   2216   %a1 = getelementptr inbounds %struct.pair* %c, i32 0, i32 0
   2217   invoke void @_Z3exceptPi(i32* %a1)
   2218           to label %invoke.cont unwind label %lpad
   2219 
   2220 invoke.cont:
   2221   ret i32 0
   2222 
   2223 lpad:
   2224   %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
   2225           catch i8* null
   2226   ret i32 0
   2227 }
   2228 
   2229 ; test19b: Addr-of a struct element passed into an invoke instruction.
   2230 ;           (GEP followed by an invoke)
   2231 ;          ssp attribute
   2232 ; Requires no protector.
   2233 define i32 @test19b() uwtable ssp {
   2234 entry:
   2235 ; LINUX-I386-LABEL: test19b:
   2236 ; LINUX-I386-NOT: calll __stack_chk_fail
   2237 ; LINUX-I386: .cfi_endproc
   2238 
   2239 ; LINUX-X64-LABEL: test19b:
   2240 ; LINUX-X64-NOT: callq __stack_chk_fail
   2241 ; LINUX-X64: .cfi_endproc
   2242 
   2243 ; LINUX-KERNEL-X64-LABEL: test19b:
   2244 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   2245 ; LINUX-KERNEL-X64: .cfi_endproc
   2246 
   2247 ; DARWIN-X64-LABEL: test19b:
   2248 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   2249 ; DARWIN-X64: .cfi_endproc
   2250   %c = alloca %struct.pair, align 4
   2251   %exn.slot = alloca i8*
   2252   %ehselector.slot = alloca i32
   2253   %a = getelementptr inbounds %struct.pair* %c, i32 0, i32 0
   2254   store i32 0, i32* %a, align 4
   2255   %a1 = getelementptr inbounds %struct.pair* %c, i32 0, i32 0
   2256   invoke void @_Z3exceptPi(i32* %a1)
   2257           to label %invoke.cont unwind label %lpad
   2258 
   2259 invoke.cont:
   2260   ret i32 0
   2261 
   2262 lpad:
   2263   %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
   2264           catch i8* null
   2265   ret i32 0
   2266 }
   2267 
   2268 ; test19c: Addr-of a struct element passed into an invoke instruction.
   2269 ;           (GEP followed by an invoke)
   2270 ;          sspstrong attribute
   2271 ; Requires protector.
   2272 define i32 @test19c() uwtable sspstrong {
   2273 entry:
   2274 ; LINUX-I386-LABEL: test19c:
   2275 ; LINUX-I386: mov{{l|q}} %gs:
   2276 ; LINUX-I386: calll __stack_chk_fail
   2277 
   2278 ; LINUX-X64-LABEL: test19c:
   2279 ; LINUX-X64: mov{{l|q}} %fs:
   2280 ; LINUX-X64: callq __stack_chk_fail
   2281 
   2282 ; LINUX-KERNEL-X64-LABEL: test19c:
   2283 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   2284 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   2285 
   2286 ; DARWIN-X64-LABEL: test19c:
   2287 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   2288 ; DARWIN-X64: callq ___stack_chk_fail
   2289   %c = alloca %struct.pair, align 4
   2290   %exn.slot = alloca i8*
   2291   %ehselector.slot = alloca i32
   2292   %a = getelementptr inbounds %struct.pair* %c, i32 0, i32 0
   2293   store i32 0, i32* %a, align 4
   2294   %a1 = getelementptr inbounds %struct.pair* %c, i32 0, i32 0
   2295   invoke void @_Z3exceptPi(i32* %a1)
   2296           to label %invoke.cont unwind label %lpad
   2297 
   2298 invoke.cont:
   2299   ret i32 0
   2300 
   2301 lpad:
   2302   %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
   2303           catch i8* null
   2304   ret i32 0
   2305 }
   2306 
   2307 ; test19d: Addr-of a struct element passed into an invoke instruction.
   2308 ;           (GEP followed by an invoke)
   2309 ;          sspreq attribute
   2310 ; Requires protector.
   2311 define i32 @test19d() uwtable sspreq {
   2312 entry:
   2313 ; LINUX-I386-LABEL: test19d:
   2314 ; LINUX-I386: mov{{l|q}} %gs:
   2315 ; LINUX-I386: calll __stack_chk_fail
   2316 
   2317 ; LINUX-X64-LABEL: test19d:
   2318 ; LINUX-X64: mov{{l|q}} %fs:
   2319 ; LINUX-X64: callq __stack_chk_fail
   2320 
   2321 ; LINUX-KERNEL-X64-LABEL: test19d:
   2322 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   2323 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   2324 
   2325 ; DARWIN-X64-LABEL: test19d:
   2326 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   2327 ; DARWIN-X64: callq ___stack_chk_fail
   2328   %c = alloca %struct.pair, align 4
   2329   %exn.slot = alloca i8*
   2330   %ehselector.slot = alloca i32
   2331   %a = getelementptr inbounds %struct.pair* %c, i32 0, i32 0
   2332   store i32 0, i32* %a, align 4
   2333   %a1 = getelementptr inbounds %struct.pair* %c, i32 0, i32 0
   2334   invoke void @_Z3exceptPi(i32* %a1)
   2335           to label %invoke.cont unwind label %lpad
   2336 
   2337 invoke.cont:
   2338   ret i32 0
   2339 
   2340 lpad:
   2341   %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
   2342           catch i8* null
   2343   ret i32 0
   2344 }
   2345 
   2346 ; test20a: Addr-of a pointer
   2347 ;          no ssp attribute
   2348 ; Requires no protector.
   2349 define void @test20a() nounwind uwtable {
   2350 entry:
   2351 ; LINUX-I386-LABEL: test20a:
   2352 ; LINUX-I386-NOT: calll __stack_chk_fail
   2353 ; LINUX-I386: .cfi_endproc
   2354 
   2355 ; LINUX-X64-LABEL: test20a:
   2356 ; LINUX-X64-NOT: callq __stack_chk_fail
   2357 ; LINUX-X64: .cfi_endproc
   2358 
   2359 ; LINUX-KERNEL-X64-LABEL: test20a:
   2360 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   2361 ; LINUX-KERNEL-X64: .cfi_endproc
   2362 
   2363 ; DARWIN-X64-LABEL: test20a:
   2364 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   2365 ; DARWIN-X64: .cfi_endproc
   2366   %a = alloca i32*, align 8
   2367   %b = alloca i32**, align 8
   2368   %call = call i32* @getp()
   2369   store i32* %call, i32** %a, align 8
   2370   store i32** %a, i32*** %b, align 8
   2371   %0 = load i32*** %b, align 8
   2372   call void @funcall2(i32** %0)
   2373   ret void
   2374 }
   2375 
   2376 ; test20b: Addr-of a pointer
   2377 ;          ssp attribute
   2378 ; Requires no protector.
   2379 define void @test20b() nounwind uwtable ssp {
   2380 entry:
   2381 ; LINUX-I386-LABEL: test20b:
   2382 ; LINUX-I386-NOT: calll __stack_chk_fail
   2383 ; LINUX-I386: .cfi_endproc
   2384 
   2385 ; LINUX-X64-LABEL: test20b:
   2386 ; LINUX-X64-NOT: callq __stack_chk_fail
   2387 ; LINUX-X64: .cfi_endproc
   2388 
   2389 ; LINUX-KERNEL-X64-LABEL: test20b:
   2390 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   2391 ; LINUX-KERNEL-X64: .cfi_endproc
   2392 
   2393 ; DARWIN-X64-LABEL: test20b:
   2394 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   2395 ; DARWIN-X64: .cfi_endproc
   2396   %a = alloca i32*, align 8
   2397   %b = alloca i32**, align 8
   2398   %call = call i32* @getp()
   2399   store i32* %call, i32** %a, align 8
   2400   store i32** %a, i32*** %b, align 8
   2401   %0 = load i32*** %b, align 8
   2402   call void @funcall2(i32** %0)
   2403   ret void
   2404 }
   2405 
   2406 ; test20c: Addr-of a pointer
   2407 ;          sspstrong attribute
   2408 ; Requires protector.
   2409 define void @test20c() nounwind uwtable sspstrong {
   2410 entry:
   2411 ; LINUX-I386-LABEL: test20c:
   2412 ; LINUX-I386: mov{{l|q}} %gs:
   2413 ; LINUX-I386: calll __stack_chk_fail
   2414 
   2415 ; LINUX-X64-LABEL: test20c:
   2416 ; LINUX-X64: mov{{l|q}} %fs:
   2417 ; LINUX-X64: callq __stack_chk_fail
   2418 
   2419 ; LINUX-KERNEL-X64-LABEL: test20c:
   2420 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   2421 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   2422 
   2423 ; DARWIN-X64-LABEL: test20c:
   2424 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   2425 ; DARWIN-X64: callq ___stack_chk_fail
   2426   %a = alloca i32*, align 8
   2427   %b = alloca i32**, align 8
   2428   %call = call i32* @getp()
   2429   store i32* %call, i32** %a, align 8
   2430   store i32** %a, i32*** %b, align 8
   2431   %0 = load i32*** %b, align 8
   2432   call void @funcall2(i32** %0)
   2433   ret void
   2434 }
   2435 
   2436 ; test20d: Addr-of a pointer
   2437 ;          sspreq attribute
   2438 ; Requires protector.
   2439 define void @test20d() nounwind uwtable sspreq {
   2440 entry:
   2441 ; LINUX-I386-LABEL: test20d:
   2442 ; LINUX-I386: mov{{l|q}} %gs:
   2443 ; LINUX-I386: calll __stack_chk_fail
   2444 
   2445 ; LINUX-X64-LABEL: test20d:
   2446 ; LINUX-X64: mov{{l|q}} %fs:
   2447 ; LINUX-X64: callq __stack_chk_fail
   2448 
   2449 ; LINUX-KERNEL-X64-LABEL: test20d:
   2450 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   2451 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   2452 
   2453 ; DARWIN-X64-LABEL: test20d:
   2454 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   2455 ; DARWIN-X64: callq ___stack_chk_fail
   2456   %a = alloca i32*, align 8
   2457   %b = alloca i32**, align 8
   2458   %call = call i32* @getp()
   2459   store i32* %call, i32** %a, align 8
   2460   store i32** %a, i32*** %b, align 8
   2461   %0 = load i32*** %b, align 8
   2462   call void @funcall2(i32** %0)
   2463   ret void
   2464 }
   2465 
   2466 ; test21a: Addr-of a casted pointer
   2467 ;          no ssp attribute
   2468 ; Requires no protector.
   2469 define void @test21a() nounwind uwtable {
   2470 entry:
   2471 ; LINUX-I386-LABEL: test21a:
   2472 ; LINUX-I386-NOT: calll __stack_chk_fail
   2473 ; LINUX-I386: .cfi_endproc
   2474 
   2475 ; LINUX-X64-LABEL: test21a:
   2476 ; LINUX-X64-NOT: callq __stack_chk_fail
   2477 ; LINUX-X64: .cfi_endproc
   2478 
   2479 ; LINUX-KERNEL-X64-LABEL: test21a:
   2480 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   2481 ; LINUX-KERNEL-X64: .cfi_endproc
   2482 
   2483 ; DARWIN-X64-LABEL: test21a:
   2484 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   2485 ; DARWIN-X64: .cfi_endproc
   2486   %a = alloca i32*, align 8
   2487   %b = alloca float**, align 8
   2488   %call = call i32* @getp()
   2489   store i32* %call, i32** %a, align 8
   2490   %0 = bitcast i32** %a to float**
   2491   store float** %0, float*** %b, align 8
   2492   %1 = load float*** %b, align 8
   2493   call void @funfloat2(float** %1)
   2494   ret void
   2495 }
   2496 
   2497 ; test21b: Addr-of a casted pointer
   2498 ;          ssp attribute
   2499 ; Requires no protector.
   2500 define void @test21b() nounwind uwtable ssp {
   2501 entry:
   2502 ; LINUX-I386-LABEL: test21b:
   2503 ; LINUX-I386-NOT: calll __stack_chk_fail
   2504 ; LINUX-I386: .cfi_endproc
   2505 
   2506 ; LINUX-X64-LABEL: test21b:
   2507 ; LINUX-X64-NOT: callq __stack_chk_fail
   2508 ; LINUX-X64: .cfi_endproc
   2509 
   2510 ; LINUX-KERNEL-X64-LABEL: test21b:
   2511 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   2512 ; LINUX-KERNEL-X64: .cfi_endproc
   2513 
   2514 ; DARWIN-X64-LABEL: test21b:
   2515 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   2516 ; DARWIN-X64: .cfi_endproc
   2517   %a = alloca i32*, align 8
   2518   %b = alloca float**, align 8
   2519   %call = call i32* @getp()
   2520   store i32* %call, i32** %a, align 8
   2521   %0 = bitcast i32** %a to float**
   2522   store float** %0, float*** %b, align 8
   2523   %1 = load float*** %b, align 8
   2524   call void @funfloat2(float** %1)
   2525   ret void
   2526 }
   2527 
   2528 ; test21c: Addr-of a casted pointer
   2529 ;          sspstrong attribute
   2530 ; Requires protector.
   2531 define void @test21c() nounwind uwtable sspstrong {
   2532 entry:
   2533 ; LINUX-I386-LABEL: test21c:
   2534 ; LINUX-I386: mov{{l|q}} %gs:
   2535 ; LINUX-I386: calll __stack_chk_fail
   2536 
   2537 ; LINUX-X64-LABEL: test21c:
   2538 ; LINUX-X64: mov{{l|q}} %fs:
   2539 ; LINUX-X64: callq __stack_chk_fail
   2540 
   2541 ; LINUX-KERNEL-X64-LABEL: test21c:
   2542 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   2543 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   2544 
   2545 ; DARWIN-X64-LABEL: test21c:
   2546 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   2547 ; DARWIN-X64: callq ___stack_chk_fail
   2548   %a = alloca i32*, align 8
   2549   %b = alloca float**, align 8
   2550   %call = call i32* @getp()
   2551   store i32* %call, i32** %a, align 8
   2552   %0 = bitcast i32** %a to float**
   2553   store float** %0, float*** %b, align 8
   2554   %1 = load float*** %b, align 8
   2555   call void @funfloat2(float** %1)
   2556   ret void
   2557 }
   2558 
   2559 ; test21d: Addr-of a casted pointer
   2560 ;          sspreq attribute
   2561 ; Requires protector.
   2562 define void @test21d() nounwind uwtable sspreq {
   2563 entry:
   2564 ; LINUX-I386-LABEL: test21d:
   2565 ; LINUX-I386: mov{{l|q}} %gs:
   2566 ; LINUX-I386: calll __stack_chk_fail
   2567 
   2568 ; LINUX-X64-LABEL: test21d:
   2569 ; LINUX-X64: mov{{l|q}} %fs:
   2570 ; LINUX-X64: callq __stack_chk_fail
   2571 
   2572 ; LINUX-KERNEL-X64-LABEL: test21d:
   2573 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   2574 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   2575 
   2576 ; DARWIN-X64-LABEL: test21d:
   2577 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   2578 ; DARWIN-X64: callq ___stack_chk_fail
   2579   %a = alloca i32*, align 8
   2580   %b = alloca float**, align 8
   2581   %call = call i32* @getp()
   2582   store i32* %call, i32** %a, align 8
   2583   %0 = bitcast i32** %a to float**
   2584   store float** %0, float*** %b, align 8
   2585   %1 = load float*** %b, align 8
   2586   call void @funfloat2(float** %1)
   2587   ret void
   2588 }
   2589 
   2590 ; test22a: [2 x i8] in a class
   2591 ;          no ssp attribute
   2592 ; Requires no protector.
   2593 define signext i8 @test22a() nounwind uwtable {
   2594 entry:
   2595 ; LINUX-I386-LABEL: test22a:
   2596 ; LINUX-I386-NOT: calll __stack_chk_fail
   2597 ; LINUX-I386: .cfi_endproc
   2598 
   2599 ; LINUX-X64-LABEL: test22a:
   2600 ; LINUX-X64-NOT: callq __stack_chk_fail
   2601 ; LINUX-X64: .cfi_endproc
   2602 
   2603 ; LINUX-KERNEL-X64-LABEL: test22a:
   2604 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   2605 ; LINUX-KERNEL-X64: .cfi_endproc
   2606 
   2607 ; DARWIN-X64-LABEL: test22a:
   2608 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   2609 ; DARWIN-X64: .cfi_endproc
   2610   %a = alloca %class.A, align 1
   2611   %array = getelementptr inbounds %class.A* %a, i32 0, i32 0
   2612   %arrayidx = getelementptr inbounds [2 x i8]* %array, i32 0, i64 0
   2613   %0 = load i8* %arrayidx, align 1
   2614   ret i8 %0
   2615 }
   2616 
   2617 ; test22b: [2 x i8] in a class
   2618 ;          ssp attribute
   2619 ; Requires no protector.
   2620 define signext i8 @test22b() nounwind uwtable ssp {
   2621 entry:
   2622 ; LINUX-I386-LABEL: test22b:
   2623 ; LINUX-I386-NOT: calll __stack_chk_fail
   2624 ; LINUX-I386: .cfi_endproc
   2625 
   2626 ; LINUX-X64-LABEL: test22b:
   2627 ; LINUX-X64-NOT: callq __stack_chk_fail
   2628 ; LINUX-X64: .cfi_endproc
   2629 
   2630 ; LINUX-KERNEL-X64-LABEL: test22b:
   2631 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   2632 ; LINUX-KERNEL-X64: .cfi_endproc
   2633 
   2634 ; DARWIN-X64-LABEL: test22b:
   2635 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   2636 ; DARWIN-X64: .cfi_endproc
   2637   %a = alloca %class.A, align 1
   2638   %array = getelementptr inbounds %class.A* %a, i32 0, i32 0
   2639   %arrayidx = getelementptr inbounds [2 x i8]* %array, i32 0, i64 0
   2640   %0 = load i8* %arrayidx, align 1
   2641   ret i8 %0
   2642 }
   2643 
   2644 ; test22c: [2 x i8] in a class
   2645 ;          sspstrong attribute
   2646 ; Requires protector.
   2647 define signext i8 @test22c() nounwind uwtable sspstrong {
   2648 entry:
   2649 ; LINUX-I386-LABEL: test22c:
   2650 ; LINUX-I386: mov{{l|q}} %gs:
   2651 ; LINUX-I386: calll __stack_chk_fail
   2652 
   2653 ; LINUX-X64-LABEL: test22c:
   2654 ; LINUX-X64: mov{{l|q}} %fs:
   2655 ; LINUX-X64: callq __stack_chk_fail
   2656 
   2657 ; LINUX-KERNEL-X64-LABEL: test22c:
   2658 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   2659 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   2660 
   2661 ; DARWIN-X64-LABEL: test22c:
   2662 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   2663 ; DARWIN-X64: callq ___stack_chk_fail
   2664   %a = alloca %class.A, align 1
   2665   %array = getelementptr inbounds %class.A* %a, i32 0, i32 0
   2666   %arrayidx = getelementptr inbounds [2 x i8]* %array, i32 0, i64 0
   2667   %0 = load i8* %arrayidx, align 1
   2668   ret i8 %0
   2669 }
   2670 
   2671 ; test22d: [2 x i8] in a class
   2672 ;          sspreq attribute
   2673 ; Requires protector.
   2674 define signext i8 @test22d() nounwind uwtable sspreq {
   2675 entry:
   2676 ; LINUX-I386-LABEL: test22d:
   2677 ; LINUX-I386: mov{{l|q}} %gs:
   2678 ; LINUX-I386: calll __stack_chk_fail
   2679 
   2680 ; LINUX-X64-LABEL: test22d:
   2681 ; LINUX-X64: mov{{l|q}} %fs:
   2682 ; LINUX-X64: callq __stack_chk_fail
   2683 
   2684 ; LINUX-KERNEL-X64-LABEL: test22d:
   2685 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   2686 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   2687 
   2688 ; DARWIN-X64-LABEL: test22d:
   2689 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   2690 ; DARWIN-X64: callq ___stack_chk_fail
   2691   %a = alloca %class.A, align 1
   2692   %array = getelementptr inbounds %class.A* %a, i32 0, i32 0
   2693   %arrayidx = getelementptr inbounds [2 x i8]* %array, i32 0, i64 0
   2694   %0 = load i8* %arrayidx, align 1
   2695   ret i8 %0
   2696 }
   2697 
   2698 ; test23a: [2 x i8] nested in several layers of structs and unions
   2699 ;          no ssp attribute
   2700 ; Requires no protector.
   2701 define signext i8 @test23a() nounwind uwtable {
   2702 entry:
   2703 ; LINUX-I386-LABEL: test23a:
   2704 ; LINUX-I386-NOT: calll __stack_chk_fail
   2705 ; LINUX-I386: .cfi_endproc
   2706 
   2707 ; LINUX-X64-LABEL: test23a:
   2708 ; LINUX-X64-NOT: callq __stack_chk_fail
   2709 ; LINUX-X64: .cfi_endproc
   2710 
   2711 ; LINUX-KERNEL-X64-LABEL: test23a:
   2712 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   2713 ; LINUX-KERNEL-X64: .cfi_endproc
   2714 
   2715 ; DARWIN-X64-LABEL: test23a:
   2716 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   2717 ; DARWIN-X64: .cfi_endproc
   2718   %x = alloca %struct.deep, align 1
   2719   %b = getelementptr inbounds %struct.deep* %x, i32 0, i32 0
   2720   %c = bitcast %union.anon* %b to %struct.anon*
   2721   %d = getelementptr inbounds %struct.anon* %c, i32 0, i32 0
   2722   %e = getelementptr inbounds %struct.anon.0* %d, i32 0, i32 0
   2723   %array = bitcast %union.anon.1* %e to [2 x i8]*
   2724   %arrayidx = getelementptr inbounds [2 x i8]* %array, i32 0, i64 0
   2725   %0 = load i8* %arrayidx, align 1
   2726   ret i8 %0
   2727 }
   2728 
   2729 ; test23b: [2 x i8] nested in several layers of structs and unions
   2730 ;          ssp attribute
   2731 ; Requires no protector.
   2732 define signext i8 @test23b() nounwind uwtable ssp {
   2733 entry:
   2734 ; LINUX-I386-LABEL: test23b:
   2735 ; LINUX-I386-NOT: calll __stack_chk_fail
   2736 ; LINUX-I386: .cfi_endproc
   2737 
   2738 ; LINUX-X64-LABEL: test23b:
   2739 ; LINUX-X64-NOT: callq __stack_chk_fail
   2740 ; LINUX-X64: .cfi_endproc
   2741 
   2742 ; LINUX-KERNEL-X64-LABEL: test23b:
   2743 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   2744 ; LINUX-KERNEL-X64: .cfi_endproc
   2745 
   2746 ; DARWIN-X64-LABEL: test23b:
   2747 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   2748 ; DARWIN-X64: .cfi_endproc
   2749   %x = alloca %struct.deep, align 1
   2750   %b = getelementptr inbounds %struct.deep* %x, i32 0, i32 0
   2751   %c = bitcast %union.anon* %b to %struct.anon*
   2752   %d = getelementptr inbounds %struct.anon* %c, i32 0, i32 0
   2753   %e = getelementptr inbounds %struct.anon.0* %d, i32 0, i32 0
   2754   %array = bitcast %union.anon.1* %e to [2 x i8]*
   2755   %arrayidx = getelementptr inbounds [2 x i8]* %array, i32 0, i64 0
   2756   %0 = load i8* %arrayidx, align 1
   2757   ret i8 %0
   2758 }
   2759 
   2760 ; test23c: [2 x i8] nested in several layers of structs and unions
   2761 ;          sspstrong attribute
   2762 ; Requires protector.
   2763 define signext i8 @test23c() nounwind uwtable sspstrong {
   2764 entry:
   2765 ; LINUX-I386-LABEL: test23c:
   2766 ; LINUX-I386: mov{{l|q}} %gs:
   2767 ; LINUX-I386: calll __stack_chk_fail
   2768 
   2769 ; LINUX-X64-LABEL: test23c:
   2770 ; LINUX-X64: mov{{l|q}} %fs:
   2771 ; LINUX-X64: callq __stack_chk_fail
   2772 
   2773 ; LINUX-KERNEL-X64-LABEL: test23c:
   2774 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   2775 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   2776 
   2777 ; DARWIN-X64-LABEL: test23c:
   2778 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   2779 ; DARWIN-X64: callq ___stack_chk_fail
   2780   %x = alloca %struct.deep, align 1
   2781   %b = getelementptr inbounds %struct.deep* %x, i32 0, i32 0
   2782   %c = bitcast %union.anon* %b to %struct.anon*
   2783   %d = getelementptr inbounds %struct.anon* %c, i32 0, i32 0
   2784   %e = getelementptr inbounds %struct.anon.0* %d, i32 0, i32 0
   2785   %array = bitcast %union.anon.1* %e to [2 x i8]*
   2786   %arrayidx = getelementptr inbounds [2 x i8]* %array, i32 0, i64 0
   2787   %0 = load i8* %arrayidx, align 1
   2788   ret i8 %0
   2789 }
   2790 
   2791 ; test23d: [2 x i8] nested in several layers of structs and unions
   2792 ;          sspreq attribute
   2793 ; Requires protector.
   2794 define signext i8 @test23d() nounwind uwtable sspreq {
   2795 entry:
   2796 ; LINUX-I386-LABEL: test23d:
   2797 ; LINUX-I386: mov{{l|q}} %gs:
   2798 ; LINUX-I386: calll __stack_chk_fail
   2799 
   2800 ; LINUX-X64-LABEL: test23d:
   2801 ; LINUX-X64: mov{{l|q}} %fs:
   2802 ; LINUX-X64: callq __stack_chk_fail
   2803 
   2804 ; LINUX-KERNEL-X64-LABEL: test23d:
   2805 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   2806 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   2807 
   2808 ; DARWIN-X64-LABEL: test23d:
   2809 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   2810 ; DARWIN-X64: callq ___stack_chk_fail
   2811   %x = alloca %struct.deep, align 1
   2812   %b = getelementptr inbounds %struct.deep* %x, i32 0, i32 0
   2813   %c = bitcast %union.anon* %b to %struct.anon*
   2814   %d = getelementptr inbounds %struct.anon* %c, i32 0, i32 0
   2815   %e = getelementptr inbounds %struct.anon.0* %d, i32 0, i32 0
   2816   %array = bitcast %union.anon.1* %e to [2 x i8]*
   2817   %arrayidx = getelementptr inbounds [2 x i8]* %array, i32 0, i64 0
   2818   %0 = load i8* %arrayidx, align 1
   2819   ret i8 %0
   2820 }
   2821 
   2822 ; test24a: Variable sized alloca
   2823 ;          no ssp attribute
   2824 ; Requires no protector.
   2825 define void @test24a(i32 %n) nounwind uwtable {
   2826 entry:
   2827 ; LINUX-I386-LABEL: test24a:
   2828 ; LINUX-I386-NOT: calll __stack_chk_fail
   2829 ; LINUX-I386: .cfi_endproc
   2830 
   2831 ; LINUX-X64-LABEL: test24a:
   2832 ; LINUX-X64-NOT: callq __stack_chk_fail
   2833 ; LINUX-X64: .cfi_endproc
   2834 
   2835 ; LINUX-KERNEL-X64-LABEL: test24a:
   2836 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   2837 ; LINUX-KERNEL-X64: .cfi_endproc
   2838 
   2839 ; DARWIN-X64-LABEL: test24a:
   2840 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   2841 ; DARWIN-X64: .cfi_endproc
   2842   %n.addr = alloca i32, align 4
   2843   %a = alloca i32*, align 8
   2844   store i32 %n, i32* %n.addr, align 4
   2845   %0 = load i32* %n.addr, align 4
   2846   %conv = sext i32 %0 to i64
   2847   %1 = alloca i8, i64 %conv
   2848   %2 = bitcast i8* %1 to i32*
   2849   store i32* %2, i32** %a, align 8
   2850   ret void
   2851 }
   2852 
   2853 ; test24b: Variable sized alloca
   2854 ;          ssp attribute
   2855 ; Requires protector.
   2856 define void @test24b(i32 %n) nounwind uwtable ssp {
   2857 entry:
   2858 ; LINUX-I386-LABEL: test24b:
   2859 ; LINUX-I386: mov{{l|q}} %gs:
   2860 ; LINUX-I386: calll __stack_chk_fail
   2861 
   2862 ; LINUX-X64-LABEL: test24b:
   2863 ; LINUX-X64: mov{{l|q}} %fs:
   2864 ; LINUX-X64: callq __stack_chk_fail
   2865 
   2866 ; LINUX-KERNEL-X64-LABEL: test24b:
   2867 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   2868 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   2869 
   2870 ; DARWIN-X64-LABEL: test24b:
   2871 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   2872 ; DARWIN-X64: callq ___stack_chk_fail
   2873   %n.addr = alloca i32, align 4
   2874   %a = alloca i32*, align 8
   2875   store i32 %n, i32* %n.addr, align 4
   2876   %0 = load i32* %n.addr, align 4
   2877   %conv = sext i32 %0 to i64
   2878   %1 = alloca i8, i64 %conv
   2879   %2 = bitcast i8* %1 to i32*
   2880   store i32* %2, i32** %a, align 8
   2881   ret void
   2882 }
   2883 
   2884 ; test24c: Variable sized alloca
   2885 ;          sspstrong attribute
   2886 ; Requires protector.
   2887 define void @test24c(i32 %n) nounwind uwtable sspstrong {
   2888 entry:
   2889 ; LINUX-I386-LABEL: test24c:
   2890 ; LINUX-I386: mov{{l|q}} %gs:
   2891 ; LINUX-I386: calll __stack_chk_fail
   2892 
   2893 ; LINUX-X64-LABEL: test24c:
   2894 ; LINUX-X64: mov{{l|q}} %fs:
   2895 ; LINUX-X64: callq __stack_chk_fail
   2896 
   2897 ; LINUX-KERNEL-X64-LABEL: test24c:
   2898 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   2899 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   2900 
   2901 ; DARWIN-X64-LABEL: test24c:
   2902 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   2903 ; DARWIN-X64: callq ___stack_chk_fail
   2904   %n.addr = alloca i32, align 4
   2905   %a = alloca i32*, align 8
   2906   store i32 %n, i32* %n.addr, align 4
   2907   %0 = load i32* %n.addr, align 4
   2908   %conv = sext i32 %0 to i64
   2909   %1 = alloca i8, i64 %conv
   2910   %2 = bitcast i8* %1 to i32*
   2911   store i32* %2, i32** %a, align 8
   2912   ret void
   2913 }
   2914 
   2915 ; test24d: Variable sized alloca
   2916 ;          sspreq attribute
   2917 ; Requires protector.
   2918 define void @test24d(i32 %n) nounwind uwtable sspreq  {
   2919 entry:
   2920 ; LINUX-I386-LABEL: test24d:
   2921 ; LINUX-I386: mov{{l|q}} %gs:
   2922 ; LINUX-I386: calll __stack_chk_fail
   2923 
   2924 ; LINUX-X64-LABEL: test24d:
   2925 ; LINUX-X64: mov{{l|q}} %fs:
   2926 ; LINUX-X64: callq __stack_chk_fail
   2927 
   2928 ; LINUX-KERNEL-X64-LABEL: test24d:
   2929 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   2930 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   2931 
   2932 ; DARWIN-X64-LABEL: test24d:
   2933 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   2934 ; DARWIN-X64: callq ___stack_chk_fail
   2935   %n.addr = alloca i32, align 4
   2936   %a = alloca i32*, align 8
   2937   store i32 %n, i32* %n.addr, align 4
   2938   %0 = load i32* %n.addr, align 4
   2939   %conv = sext i32 %0 to i64
   2940   %1 = alloca i8, i64 %conv
   2941   %2 = bitcast i8* %1 to i32*
   2942   store i32* %2, i32** %a, align 8
   2943   ret void
   2944 }
   2945 
   2946 ; test25a: array of [4 x i32]
   2947 ;          no ssp attribute
   2948 ; Requires no protector.
   2949 define i32 @test25a() nounwind uwtable {
   2950 entry:
   2951 ; LINUX-I386-LABEL: test25a:
   2952 ; LINUX-I386-NOT: calll __stack_chk_fail
   2953 ; LINUX-I386: .cfi_endproc
   2954 
   2955 ; LINUX-X64-LABEL: test25a:
   2956 ; LINUX-X64-NOT: callq __stack_chk_fail
   2957 ; LINUX-X64: .cfi_endproc
   2958 
   2959 ; LINUX-KERNEL-X64-LABEL: test25a:
   2960 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   2961 ; LINUX-KERNEL-X64: .cfi_endproc
   2962 
   2963 ; DARWIN-X64-LABEL: test25a:
   2964 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   2965 ; DARWIN-X64: .cfi_endproc
   2966   %a = alloca [4 x i32], align 16
   2967   %arrayidx = getelementptr inbounds [4 x i32]* %a, i32 0, i64 0
   2968   %0 = load i32* %arrayidx, align 4
   2969   ret i32 %0
   2970 }
   2971 
   2972 ; test25b: array of [4 x i32]
   2973 ;          ssp attribute
   2974 ; Requires no protector, except for Darwin which _does_ require a protector.
   2975 define i32 @test25b() nounwind uwtable ssp {
   2976 entry:
   2977 ; LINUX-I386-LABEL: test25b:
   2978 ; LINUX-I386-NOT: calll __stack_chk_fail
   2979 ; LINUX-I386: .cfi_endproc
   2980 
   2981 ; LINUX-X64-LABEL: test25b:
   2982 ; LINUX-X64-NOT: callq __stack_chk_fail
   2983 ; LINUX-X64: .cfi_endproc
   2984 
   2985 ; LINUX-KERNEL-X64-LABEL: test25b:
   2986 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   2987 ; LINUX-KERNEL-X64: .cfi_endproc
   2988 
   2989 ; DARWIN-X64-LABEL: test25b:
   2990 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   2991 ; DARWIN-X64: callq ___stack_chk_fail
   2992   %a = alloca [4 x i32], align 16
   2993   %arrayidx = getelementptr inbounds [4 x i32]* %a, i32 0, i64 0
   2994   %0 = load i32* %arrayidx, align 4
   2995   ret i32 %0
   2996 }
   2997 
   2998 ; test25c: array of [4 x i32]
   2999 ;          sspstrong attribute
   3000 ; Requires protector.
   3001 define i32 @test25c() nounwind uwtable sspstrong {
   3002 entry:
   3003 ; LINUX-I386-LABEL: test25c:
   3004 ; LINUX-I386: mov{{l|q}} %gs:
   3005 ; LINUX-I386: calll __stack_chk_fail
   3006 
   3007 ; LINUX-X64-LABEL: test25c:
   3008 ; LINUX-X64: mov{{l|q}} %fs:
   3009 ; LINUX-X64: callq __stack_chk_fail
   3010 
   3011 ; LINUX-KERNEL-X64-LABEL: test25c:
   3012 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   3013 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   3014 
   3015 ; DARWIN-X64-LABEL: test25c:
   3016 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   3017 ; DARWIN-X64: callq ___stack_chk_fail
   3018   %a = alloca [4 x i32], align 16
   3019   %arrayidx = getelementptr inbounds [4 x i32]* %a, i32 0, i64 0
   3020   %0 = load i32* %arrayidx, align 4
   3021   ret i32 %0
   3022 }
   3023 
   3024 ; test25d: array of [4 x i32]
   3025 ;          sspreq attribute
   3026 ; Requires protector.
   3027 define i32 @test25d() nounwind uwtable sspreq {
   3028 entry:
   3029 ; LINUX-I386-LABEL: test25d:
   3030 ; LINUX-I386: mov{{l|q}} %gs:
   3031 ; LINUX-I386: calll __stack_chk_fail
   3032 
   3033 ; LINUX-X64-LABEL: test25d:
   3034 ; LINUX-X64: mov{{l|q}} %fs:
   3035 ; LINUX-X64: callq __stack_chk_fail
   3036 
   3037 ; LINUX-KERNEL-X64-LABEL: test25d:
   3038 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   3039 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   3040 
   3041 ; DARWIN-X64-LABEL: test25d:
   3042 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   3043 ; DARWIN-X64: callq ___stack_chk_fail
   3044   %a = alloca [4 x i32], align 16
   3045   %arrayidx = getelementptr inbounds [4 x i32]* %a, i32 0, i64 0
   3046   %0 = load i32* %arrayidx, align 4
   3047   ret i32 %0
   3048 }
   3049 
   3050 ; test26: Nested structure, no arrays, no address-of expressions.
   3051 ;         Verify that the resulting gep-of-gep does not incorrectly trigger
   3052 ;         a stack protector.
   3053 ;         ssptrong attribute
   3054 ; Requires no protector.
   3055 define void @test26() nounwind uwtable sspstrong {
   3056 entry:
   3057 ; LINUX-I386-LABEL: test26:
   3058 ; LINUX-I386-NOT: calll __stack_chk_fail
   3059 ; LINUX-I386: .cfi_endproc
   3060 
   3061 ; LINUX-X64-LABEL: test26:
   3062 ; LINUX-X64-NOT: callq __stack_chk_fail
   3063 ; LINUX-X64: .cfi_endproc
   3064 
   3065 ; LINUX-KERNEL-X64-LABEL: test26:
   3066 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail
   3067 ; LINUX-KERNEL-X64: .cfi_endproc
   3068 
   3069 ; DARWIN-X64-LABEL: test26:
   3070 ; DARWIN-X64-NOT: callq ___stack_chk_fail
   3071 ; DARWIN-X64: .cfi_endproc
   3072   %c = alloca %struct.nest, align 4
   3073   %b = getelementptr inbounds %struct.nest* %c, i32 0, i32 1
   3074   %_a = getelementptr inbounds %struct.pair* %b, i32 0, i32 0
   3075   %0 = load i32* %_a, align 4
   3076   %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i32 %0)
   3077   ret void
   3078 }
   3079 
   3080 ; test27: Address-of a structure taken in a function with a loop where
   3081 ;         the alloca is an incoming value to a PHI node and a use of that PHI 
   3082 ;         node is also an incoming value.
   3083 ;         Verify that the address-of analysis does not get stuck in infinite
   3084 ;         recursion when chasing the alloca through the PHI nodes.
   3085 ; Requires protector.
   3086 define i32 @test27(i32 %arg) nounwind uwtable sspstrong {
   3087 bb:
   3088 ; LINUX-I386-LABEL: test27:
   3089 ; LINUX-I386: mov{{l|q}} %gs:
   3090 ; LINUX-I386: calll __stack_chk_fail
   3091 
   3092 ; LINUX-X64-LABEL: test27:
   3093 ; LINUX-X64: mov{{l|q}} %fs:
   3094 ; LINUX-X64: callq __stack_chk_fail
   3095 
   3096 ; LINUX-KERNEL-X64-LABEL: test27:
   3097 ; LINUX-KERNEL-X64: mov{{l|q}} %gs:
   3098 ; LINUX-KERNEL-X64: callq __stack_chk_fail
   3099 
   3100 ; DARWIN-X64-LABEL: test27:
   3101 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard
   3102 ; DARWIN-X64: callq ___stack_chk_fail
   3103   %tmp = alloca %struct.small*, align 8
   3104   %tmp1 = call i32 (...)* @dummy(%struct.small** %tmp) nounwind
   3105   %tmp2 = load %struct.small** %tmp, align 8
   3106   %tmp3 = ptrtoint %struct.small* %tmp2 to i64
   3107   %tmp4 = trunc i64 %tmp3 to i32
   3108   %tmp5 = icmp sgt i32 %tmp4, 0
   3109   br i1 %tmp5, label %bb6, label %bb21
   3110 
   3111 bb6:                                              ; preds = %bb17, %bb
   3112   %tmp7 = phi %struct.small* [ %tmp19, %bb17 ], [ %tmp2, %bb ]
   3113   %tmp8 = phi i64 [ %tmp20, %bb17 ], [ 1, %bb ]
   3114   %tmp9 = phi i32 [ %tmp14, %bb17 ], [ %tmp1, %bb ]
   3115   %tmp10 = getelementptr inbounds %struct.small* %tmp7, i64 0, i32 0
   3116   %tmp11 = load i8* %tmp10, align 1
   3117   %tmp12 = icmp eq i8 %tmp11, 1
   3118   %tmp13 = add nsw i32 %tmp9, 8
   3119   %tmp14 = select i1 %tmp12, i32 %tmp13, i32 %tmp9
   3120   %tmp15 = trunc i64 %tmp8 to i32
   3121   %tmp16 = icmp eq i32 %tmp15, %tmp4
   3122   br i1 %tmp16, label %bb21, label %bb17
   3123 
   3124 bb17:                                             ; preds = %bb6
   3125   %tmp18 = getelementptr inbounds %struct.small** %tmp, i64 %tmp8
   3126   %tmp19 = load %struct.small** %tmp18, align 8
   3127   %tmp20 = add i64 %tmp8, 1
   3128   br label %bb6
   3129 
   3130 bb21:                                             ; preds = %bb6, %bb
   3131   %tmp22 = phi i32 [ %tmp1, %bb ], [ %tmp14, %bb6 ]
   3132   %tmp23 = call i32 (...)* @dummy(i32 %tmp22) nounwind
   3133   ret i32 undef
   3134 }
   3135 
   3136 declare double @testi_aux()
   3137 declare i8* @strcpy(i8*, i8*)
   3138 declare i32 @printf(i8*, ...)
   3139 declare void @funcall(i32*)
   3140 declare void @funcall2(i32**)
   3141 declare void @funfloat(float*)
   3142 declare void @funfloat2(float**)
   3143 declare void @_Z3exceptPi(i32*)
   3144 declare i32 @__gxx_personality_v0(...)
   3145 declare i32* @getp()
   3146 declare i32 @dummy(...)
   3147