Index: lib/Target/ARM/ARMConstantIslandPass.cpp =================================================================== --- lib/Target/ARM/ARMConstantIslandPass.cpp +++ lib/Target/ARM/ARMConstantIslandPass.cpp @@ -1420,6 +1420,18 @@ MI = LastIT; } + // Avoid splitting a MOVW+MOVT pair with a relocation on Windows. + // On Windows, this instruction pair is covered by one single + // IMAGE_REL_ARM_MOV32T relocation which covers both instructions. If a + // constant island is injected inbetween them, the relocation will clobber + // the instruction and fail to update the MOVT instruction. + if (STI->isTargetWindows() && isThumb && MI->getOpcode() == ARM::t2MOVTi16 && + MI->getNumOperands() >= 3 && + (MI->getOperand(2).getTargetFlags() & ARMII::MO_OPTION_MASK) == + ARMII::MO_HI16) { + --MI; + } + // We really must not split an IT block. LLVM_DEBUG(unsigned PredReg; assert( !isThumb || getITInstrPredicate(*MI, PredReg) == ARMCC::AL)); Index: test/CodeGen/ARM/constant-island-movwt.ll =================================================================== --- /dev/null +++ test/CodeGen/ARM/constant-island-movwt.ll @@ -0,0 +1,315 @@ +; RUN: llc -mtriple=thumbv7-win32-gnu -o - %s | FileCheck %s + +%struct.A = type { [201 x i8*] } + +@.str.17 = private unnamed_addr constant [10 x i8] c"__ashlhi3\00", align 1 +@.str.18 = private unnamed_addr constant [10 x i8] c"__ashlsi3\00", align 1 +@.str.19 = private unnamed_addr constant [10 x i8] c"__ashldi3\00", align 1 +@.str.20 = private unnamed_addr constant [10 x i8] c"__ashlti3\00", align 1 +@.str.21 = private unnamed_addr constant [10 x i8] c"__lshrhi3\00", align 1 +@.str.22 = private unnamed_addr constant [10 x i8] c"__lshrsi3\00", align 1 +@.str.23 = private unnamed_addr constant [10 x i8] c"__lshrdi3\00", align 1 +@.str.24 = private unnamed_addr constant [10 x i8] c"__lshrti3\00", align 1 +@.str.25 = private unnamed_addr constant [10 x i8] c"__ashrhi3\00", align 1 +@.str.26 = private unnamed_addr constant [10 x i8] c"__ashrsi3\00", align 1 +@.str.27 = private unnamed_addr constant [10 x i8] c"__ashrdi3\00", align 1 +@.str.28 = private unnamed_addr constant [10 x i8] c"__ashrti3\00", align 1 +@.str.29 = private unnamed_addr constant [9 x i8] c"__mulqi3\00", align 1 +@.str.30 = private unnamed_addr constant [9 x i8] c"__mulhi3\00", align 1 +@.str.31 = private unnamed_addr constant [9 x i8] c"__mulsi3\00", align 1 +@.str.32 = private unnamed_addr constant [9 x i8] c"__muldi3\00", align 1 +@.str.33 = private unnamed_addr constant [9 x i8] c"__multi3\00", align 1 +@.str.34 = private unnamed_addr constant [10 x i8] c"__mulosi4\00", align 1 +@.str.35 = private unnamed_addr constant [10 x i8] c"__mulodi4\00", align 1 +@.str.36 = private unnamed_addr constant [10 x i8] c"__muloti4\00", align 1 +@.str.37 = private unnamed_addr constant [9 x i8] c"__divqi3\00", align 1 +@.str.38 = private unnamed_addr constant [9 x i8] c"__divhi3\00", align 1 +@.str.39 = private unnamed_addr constant [9 x i8] c"__divsi3\00", align 1 +@.str.40 = private unnamed_addr constant [9 x i8] c"__divdi3\00", align 1 +@.str.41 = private unnamed_addr constant [9 x i8] c"__divti3\00", align 1 +@.str.42 = private unnamed_addr constant [10 x i8] c"__udivqi3\00", align 1 +@.str.43 = private unnamed_addr constant [10 x i8] c"__udivhi3\00", align 1 +@.str.44 = private unnamed_addr constant [10 x i8] c"__udivsi3\00", align 1 +@.str.45 = private unnamed_addr constant [10 x i8] c"__udivdi3\00", align 1 +@.str.46 = private unnamed_addr constant [10 x i8] c"__udivti3\00", align 1 +@.str.47 = private unnamed_addr constant [9 x i8] c"__modqi3\00", align 1 +@.str.48 = private unnamed_addr constant [9 x i8] c"__modhi3\00", align 1 +@.str.49 = private unnamed_addr constant [9 x i8] c"__modsi3\00", align 1 +@.str.50 = private unnamed_addr constant [9 x i8] c"__moddi3\00", align 1 +@.str.51 = private unnamed_addr constant [9 x i8] c"__modti3\00", align 1 +@.str.52 = private unnamed_addr constant [10 x i8] c"__umodqi3\00", align 1 +@.str.53 = private unnamed_addr constant [10 x i8] c"__umodhi3\00", align 1 +@.str.54 = private unnamed_addr constant [10 x i8] c"__umodsi3\00", align 1 +@.str.55 = private unnamed_addr constant [10 x i8] c"__umoddi3\00", align 1 +@.str.56 = private unnamed_addr constant [10 x i8] c"__umodti3\00", align 1 +@.str.57 = private unnamed_addr constant [9 x i8] c"__negsi2\00", align 1 +@.str.58 = private unnamed_addr constant [9 x i8] c"__negdi2\00", align 1 +@.str.59 = private unnamed_addr constant [9 x i8] c"__addsf3\00", align 1 +@.str.60 = private unnamed_addr constant [9 x i8] c"__adddf3\00", align 1 +@.str.61 = private unnamed_addr constant [9 x i8] c"__addxf3\00", align 1 +@.str.62 = private unnamed_addr constant [9 x i8] c"__addtf3\00", align 1 +@.str.63 = private unnamed_addr constant [11 x i8] c"__gcc_qadd\00", align 1 +@.str.64 = private unnamed_addr constant [9 x i8] c"__subsf3\00", align 1 +@.str.65 = private unnamed_addr constant [9 x i8] c"__subdf3\00", align 1 +@.str.66 = private unnamed_addr constant [9 x i8] c"__subxf3\00", align 1 +@.str.67 = private unnamed_addr constant [9 x i8] c"__subtf3\00", align 1 +@.str.68 = private unnamed_addr constant [11 x i8] c"__gcc_qsub\00", align 1 +@.str.69 = private unnamed_addr constant [9 x i8] c"__mulsf3\00", align 1 +@.str.70 = private unnamed_addr constant [9 x i8] c"__muldf3\00", align 1 +@.str.71 = private unnamed_addr constant [9 x i8] c"__mulxf3\00", align 1 +@.str.72 = private unnamed_addr constant [9 x i8] c"__multf3\00", align 1 +@.str.73 = private unnamed_addr constant [11 x i8] c"__gcc_qmul\00", align 1 +@.str.74 = private unnamed_addr constant [9 x i8] c"__divsf3\00", align 1 +@.str.75 = private unnamed_addr constant [9 x i8] c"__divdf3\00", align 1 +@.str.76 = private unnamed_addr constant [9 x i8] c"__divxf3\00", align 1 +@.str.77 = private unnamed_addr constant [9 x i8] c"__divtf3\00", align 1 +@.str.78 = private unnamed_addr constant [11 x i8] c"__gcc_qdiv\00", align 1 +@.str.79 = private unnamed_addr constant [6 x i8] c"fmodf\00", align 1 +@.str.80 = private unnamed_addr constant [5 x i8] c"fmod\00", align 1 +@.str.81 = private unnamed_addr constant [6 x i8] c"fmodl\00", align 1 +@.str.82 = private unnamed_addr constant [5 x i8] c"fmaf\00", align 1 +@.str.83 = private unnamed_addr constant [4 x i8] c"fma\00", align 1 +@.str.84 = private unnamed_addr constant [5 x i8] c"fmal\00", align 1 +@.str.85 = private unnamed_addr constant [10 x i8] c"__powisf2\00", align 1 +@.str.86 = private unnamed_addr constant [10 x i8] c"__powidf2\00", align 1 +@.str.87 = private unnamed_addr constant [10 x i8] c"__powixf2\00", align 1 +@.str.88 = private unnamed_addr constant [10 x i8] c"__powitf2\00", align 1 +@.str.89 = private unnamed_addr constant [6 x i8] c"sqrtf\00", align 1 +@.str.90 = private unnamed_addr constant [5 x i8] c"sqrt\00", align 1 +@.str.91 = private unnamed_addr constant [6 x i8] c"sqrtl\00", align 1 +@.str.92 = private unnamed_addr constant [5 x i8] c"logf\00", align 1 +@.str.93 = private unnamed_addr constant [4 x i8] c"log\00", align 1 +@.str.94 = private unnamed_addr constant [5 x i8] c"logl\00", align 1 +@.str.95 = private unnamed_addr constant [14 x i8] c"__logf_finite\00", align 1 +@.str.96 = private unnamed_addr constant [13 x i8] c"__log_finite\00", align 1 +@.str.97 = private unnamed_addr constant [14 x i8] c"__logl_finite\00", align 1 +@.str.98 = private unnamed_addr constant [6 x i8] c"log2f\00", align 1 +@.str.99 = private unnamed_addr constant [5 x i8] c"log2\00", align 1 +@.str.100 = private unnamed_addr constant [6 x i8] c"log2l\00", align 1 +@.str.101 = private unnamed_addr constant [15 x i8] c"__log2f_finite\00", align 1 +@.str.102 = private unnamed_addr constant [14 x i8] c"__log2_finite\00", align 1 +@.str.103 = private unnamed_addr constant [15 x i8] c"__log2l_finite\00", align 1 +@.str.104 = private unnamed_addr constant [7 x i8] c"log10f\00", align 1 +@.str.105 = private unnamed_addr constant [6 x i8] c"log10\00", align 1 +@.str.106 = private unnamed_addr constant [7 x i8] c"log10l\00", align 1 +@.str.107 = private unnamed_addr constant [16 x i8] c"__log10f_finite\00", align 1 +@.str.108 = private unnamed_addr constant [15 x i8] c"__log10_finite\00", align 1 +@.str.109 = private unnamed_addr constant [16 x i8] c"__log10l_finite\00", align 1 +@.str.110 = private unnamed_addr constant [5 x i8] c"expf\00", align 1 +@.str.111 = private unnamed_addr constant [4 x i8] c"exp\00", align 1 +@.str.112 = private unnamed_addr constant [5 x i8] c"expl\00", align 1 +@.str.113 = private unnamed_addr constant [14 x i8] c"__expf_finite\00", align 1 +@.str.114 = private unnamed_addr constant [13 x i8] c"__exp_finite\00", align 1 +@.str.115 = private unnamed_addr constant [14 x i8] c"__expl_finite\00", align 1 +@.str.116 = private unnamed_addr constant [6 x i8] c"exp2f\00", align 1 +@.str.117 = private unnamed_addr constant [5 x i8] c"exp2\00", align 1 +@.str.118 = private unnamed_addr constant [6 x i8] c"exp2l\00", align 1 +@.str.119 = private unnamed_addr constant [15 x i8] c"__exp2f_finite\00", align 1 +@.str.120 = private unnamed_addr constant [14 x i8] c"__exp2_finite\00", align 1 +@.str.121 = private unnamed_addr constant [15 x i8] c"__exp2l_finite\00", align 1 +@.str.122 = private unnamed_addr constant [5 x i8] c"sinf\00", align 1 +@.str.123 = private unnamed_addr constant [4 x i8] c"sin\00", align 1 +@.str.124 = private unnamed_addr constant [5 x i8] c"sinl\00", align 1 +@.str.125 = private unnamed_addr constant [5 x i8] c"cosf\00", align 1 +@.str.126 = private unnamed_addr constant [4 x i8] c"cos\00", align 1 +@.str.127 = private unnamed_addr constant [5 x i8] c"cosl\00", align 1 +@.str.128 = private unnamed_addr constant [5 x i8] c"powf\00", align 1 +@.str.129 = private unnamed_addr constant [4 x i8] c"pow\00", align 1 +@.str.130 = private unnamed_addr constant [5 x i8] c"powl\00", align 1 +@.str.131 = private unnamed_addr constant [14 x i8] c"__powf_finite\00", align 1 +@.str.132 = private unnamed_addr constant [13 x i8] c"__pow_finite\00", align 1 +@.str.133 = private unnamed_addr constant [14 x i8] c"__powl_finite\00", align 1 +@.str.134 = private unnamed_addr constant [6 x i8] c"ceilf\00", align 1 +@.str.135 = private unnamed_addr constant [5 x i8] c"ceil\00", align 1 +@.str.136 = private unnamed_addr constant [6 x i8] c"ceill\00", align 1 +@.str.137 = private unnamed_addr constant [7 x i8] c"truncf\00", align 1 +@.str.138 = private unnamed_addr constant [6 x i8] c"trunc\00", align 1 +@.str.139 = private unnamed_addr constant [7 x i8] c"truncl\00", align 1 +@.str.140 = private unnamed_addr constant [6 x i8] c"rintf\00", align 1 +@.str.141 = private unnamed_addr constant [5 x i8] c"rint\00", align 1 +@.str.142 = private unnamed_addr constant [6 x i8] c"rintl\00", align 1 +@.str.143 = private unnamed_addr constant [11 x i8] c"nearbyintf\00", align 1 +@.str.144 = private unnamed_addr constant [10 x i8] c"nearbyint\00", align 1 +@.str.145 = private unnamed_addr constant [11 x i8] c"nearbyintl\00", align 1 +@.str.146 = private unnamed_addr constant [7 x i8] c"roundf\00", align 1 +@.str.147 = private unnamed_addr constant [6 x i8] c"round\00", align 1 +@.str.148 = private unnamed_addr constant [7 x i8] c"roundl\00", align 1 +@.str.149 = private unnamed_addr constant [7 x i8] c"floorf\00", align 1 +@.str.150 = private unnamed_addr constant [6 x i8] c"floor\00", align 1 +@.str.151 = private unnamed_addr constant [7 x i8] c"floorl\00", align 1 +@.str.152 = private unnamed_addr constant [10 x i8] c"copysignf\00", align 1 +@.str.153 = private unnamed_addr constant [9 x i8] c"copysign\00", align 1 + +define arm_aapcs_vfpcc void @func(%struct.A* %obj) #0 { +entry: + %arrayidx.i = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 0 + %0 = bitcast i8** %arrayidx.i to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %0 + %arrayidx.i62 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 4 + %1 = bitcast i8** %arrayidx.i62 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %1 + %arrayidx.i523 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 8 + %2 = bitcast i8** %arrayidx.i523 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %2 + %arrayidx.i519 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 12 + %3 = bitcast i8** %arrayidx.i519 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %3 + %arrayidx.i515 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 16 + %4 = bitcast i8** %arrayidx.i515 to i8* + call void @llvm.memset.p0i8.i64(i8* nonnull %4, i8 0, i64 40, i32 4, i1 false) + %arrayidx.i511 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 20 + %5 = bitcast i8** %arrayidx.i511 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %5 + %arrayidx.i507 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 24 + %6 = bitcast i8** %arrayidx.i507 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %6 + %arrayidx.i503 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 28 + %7 = bitcast i8** %arrayidx.i503 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %7 + %arrayidx.i499 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 32 + %8 = bitcast i8** %arrayidx.i499 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %8 + %arrayidx.i495 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 36 + %9 = bitcast i8** %arrayidx.i495 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %9 + %arrayidx.i491 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 40 + %arrayidx.i481 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 50 + %10 = bitcast i8** %arrayidx.i491 to i8* + call void @llvm.memset.p0i8.i64(i8* nonnull %10, i8 0, i64 40, i32 4, i1 false) + %11 = bitcast i8** %arrayidx.i481 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %11 + %arrayidx.i477 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 54 + %12 = bitcast i8** %arrayidx.i477 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %12 + %arrayidx.i473 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 58 + %13 = bitcast i8** %arrayidx.i473 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %13 + %arrayidx.i469 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 62 + %14 = bitcast i8** %arrayidx.i469 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %14 + %arrayidx.i465 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 66 + %15 = bitcast i8** %arrayidx.i465 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %15 + %arrayidx.i461 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 70 + %16 = bitcast i8** %arrayidx.i461 to i8* + call void @llvm.memset.p0i8.i64(i8* nonnull %16, i8 0, i64 40, i32 4, i1 false) + %arrayidx.i457 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 74 + %17 = bitcast i8** %arrayidx.i457 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %17 + %arrayidx.i453 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 78 + %18 = bitcast i8** %arrayidx.i453 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %18 + %arrayidx.i449 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 82 + %19 = bitcast i8** %arrayidx.i449 to <4 x i8*>* +; store <4 x i8*> , <4 x i8*>* %19 + %arrayidx.i445 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 86 + %20 = bitcast i8** %arrayidx.i445 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %20 + %arrayidx.i441 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 90 + %21 = bitcast i8** %arrayidx.i441 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %21 + %arrayidx.i437 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 94 + %22 = bitcast i8** %arrayidx.i437 to i8* + call void @llvm.memset.p0i8.i64(i8* nonnull %22, i8 0, i64 28, i32 4, i1 false) + %arrayidx.i433 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 98 + %23 = bitcast i8** %arrayidx.i433 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %23 + %arrayidx.i429 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 102 + %24 = bitcast i8** %arrayidx.i429 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %24 + %arrayidx.i425 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 106 + %25 = bitcast i8** %arrayidx.i425 to i8* + call void @llvm.memset.p0i8.i64(i8* nonnull %25, i8 0, i64 28, i32 4, i1 false) + %arrayidx.i421 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 110 + %26 = bitcast i8** %arrayidx.i421 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %26 + %arrayidx.i417 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 114 + %27 = bitcast i8** %arrayidx.i417 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %27 + %arrayidx.i413 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 118 + %28 = bitcast i8** %arrayidx.i413 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %28 + %arrayidx.i409 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 122 + %29 = bitcast i8** %arrayidx.i409 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %29 + %arrayidx.i405 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 126 + %30 = bitcast i8** %arrayidx.i405 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %30 + %arrayidx.i401 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 130 + %31 = bitcast i8** %arrayidx.i401 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %31 + %arrayidx.i397 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 134 + %32 = bitcast i8** %arrayidx.i397 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %32 + %arrayidx.i393 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 138 + %33 = bitcast i8** %arrayidx.i393 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %33 + %arrayidx.i389 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 142 + %34 = bitcast i8** %arrayidx.i389 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %34 + %arrayidx.i385 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 146 + %35 = bitcast i8** %arrayidx.i385 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %35 + %arrayidx.i381 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 150 + store i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.127, i32 0, i32 0), i8** %arrayidx.i381 + %arrayidx.i380 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 151 + store i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.127, i32 0, i32 0), i8** %arrayidx.i380 + %arrayidx.i379 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 152 + %arrayidx.i375 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 156 + %arrayidx.i374 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 157 + %arrayidx.i373 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 158 + %arrayidx.i372 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 159 + %36 = bitcast i8** %arrayidx.i379 to i8* + call void @llvm.memset.p0i8.i64(i8* nonnull %36, i8 0, i64 28, i32 4, i1 false) + store i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.128, i32 0, i32 0), i8** %arrayidx.i372 + %arrayidx.i371 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 160 + store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.129, i32 0, i32 0), i8** %arrayidx.i371 + %arrayidx.i370 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 161 + %37 = bitcast i8** %arrayidx.i370 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %37 + %arrayidx.i366 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 165 + %38 = bitcast i8** %arrayidx.i366 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %38 + %arrayidx.i362 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 169 + %39 = bitcast i8** %arrayidx.i362 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %39 + %arrayidx.i358 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 173 + %40 = bitcast i8** %arrayidx.i358 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %40 + %arrayidx.i354 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 177 + %41 = bitcast i8** %arrayidx.i354 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %41 + %arrayidx.i350 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 181 + %42 = bitcast i8** %arrayidx.i350 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %42 + %arrayidx.i346 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 185 + %43 = bitcast i8** %arrayidx.i346 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %43 + %arrayidx.i342 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 189 + %44 = bitcast i8** %arrayidx.i342 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %44 + %arrayidx.i338 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 193 + %45 = bitcast i8** %arrayidx.i338 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %45 + %arrayidx.i334 = getelementptr inbounds %struct.A, %struct.A* %obj, i32 0, i32 0, i32 197 + %46 = bitcast i8** %arrayidx.i334 to <4 x i8*>* + store <4 x i8*> , <4 x i8*>* %46 + ret void +} + +declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i32, i1) + +attributes #0 = { nounwind "target-cpu"="cortex-a9" "target-features"="+dsp,+fp16,+neon,+strict-align,+thumb-mode,+vfp3" } + +; CHECK: movw r5, :lower16:.L.str.118 +; CHECK-NEXT: movt r5, :upper16:.L.str.118 +; CHECK-NEXT: vdup.32 q12, r5 +; CHECK-NEXT: b.w .LBB0_2 +; CHECK-NEXT: .p2align 2 +; CHECK-NEXT: @ %bb.1: +; CHECK-NEXT: .LCPI0_1: +; CHECK-NEXT: .long 0 @ float 0 +; CHECK-NEXT: .p2align 1 +; CHECK-NEXT: .LBB0_2: @ %entry +; CHECK-NEXT: movw r5, :lower16:.L.str.84 +; CHECK-NEXT: movt r5, :upper16:.L.str.84