brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.0 KiB · a3b0371 Raw
245 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s3;4; Test PC-relative memory accesses of globals with packed struct types.5; PC-relative memory accesses cannot be used when the address is not6; aligned. This can happen with programs like the following (which are not7; strictly correct):8;9; #pragma pack(1)10; struct  {11;   short a;12;   int b;13; } c;14;15; void main()    {16;   int *e = &c.b;17;   *e = 0;18; }19;20 21%packed.i16i32 = type <{ i16, i32 }>22%packed.i16i32i16i32 = type <{ i16, i32, i16, i32 }>23%packed.i16i64 = type <{ i16, i64 }>24%packed.i8i16 = type <{ i8, i16 }>25 26@A_align2 = dso_local global %packed.i16i32 zeroinitializer, align 227@B_align2 = dso_local global %packed.i16i32i16i32 zeroinitializer, align 228@C_align2 = dso_local global %packed.i16i64 zeroinitializer, align 229@D_align4 = dso_local global %packed.i16i32 zeroinitializer, align 430@E_align4 = dso_local global %packed.i16i32i16i32 zeroinitializer, align 431@F_align2 = dso_local global %packed.i8i16 zeroinitializer, align 232 33;;; Stores34 35; unaligned packed struct + 2  -> unaligned address36define dso_local void @f1() {37; CHECK-LABEL: f1:38; CHECK:       # %bb.0:39; CHECK-NEXT:    larl %r1, A_align240; CHECK-NEXT:    mvhi 2(%r1), 041; CHECK-NEXT:    br %r1442  store i32 0, ptr getelementptr inbounds (%packed.i16i32, ptr @A_align2, i64 0, i32 1), align 443  ret void44}45 46; unaligned packed struct  + 8  -> unaligned address47define dso_local void @f2() {48; CHECK-LABEL: f2:49; CHECK:       # %bb.0:50; CHECK-NEXT:    larl %r1, B_align251; CHECK-NEXT:    mvhi 8(%r1), 052; CHECK-NEXT:    br %r1453  store i32 0, ptr getelementptr inbounds (%packed.i16i32i16i32, ptr @B_align2, i64 0, i32 3), align 454  ret void55}56 57; aligned packed struct + 2  -> unaligned address58define dso_local void @f3() {59; CHECK-LABEL: f3:60; CHECK:       # %bb.0:61; CHECK-NEXT:    larl %r1, D_align462; CHECK-NEXT:    mvhi 2(%r1), 063; CHECK-NEXT:    br %r1464  store i32 0, ptr getelementptr inbounds (%packed.i16i32, ptr @D_align4, i64 0, i32 1), align 465  ret void66}67 68; aligned packed struct + 8  -> aligned address69define dso_local void @f4() {70; CHECK-LABEL: f4:71; CHECK:       # %bb.0:72; CHECK-NEXT:    lhi %r0, 073; CHECK-NEXT:    strl %r0, E_align4+874; CHECK-NEXT:    br %r1475  store i32 0, ptr getelementptr inbounds (%packed.i16i32i16i32, ptr @E_align4, i64 0, i32 3), align 476  ret void77}78 79define dso_local void @f5() {80; CHECK-LABEL: f5:81; CHECK:       # %bb.0:82; CHECK-NEXT:    larl %r1, C_align283; CHECK-NEXT:    mvghi 2(%r1), 084; CHECK-NEXT:    br %r1485  store i64 0, ptr getelementptr inbounds (%packed.i16i64, ptr @C_align2, i64 0, i32 1), align 886  ret void87}88 89define dso_local void @f6() {90; CHECK-LABEL: f6:91; CHECK:       # %bb.0:92; CHECK-NEXT:    larl %r1, F_align293; CHECK-NEXT:    mvhhi 1(%r1), 094; CHECK-NEXT:    br %r1495  store i16 0, ptr getelementptr inbounds (%packed.i8i16, ptr @F_align2, i64 0, i32 1), align 296  ret void97}98 99define dso_local void @f7(ptr %Src) {100; CHECK-LABEL: f7:101; CHECK:       # %bb.0:102; CHECK-NEXT:    lg %r0, 0(%r2)103; CHECK-NEXT:    larl %r1, D_align4104; CHECK-NEXT:    st %r0, 2(%r1)105; CHECK-NEXT:    br %r14106  %L = load i64, ptr %Src107  %T = trunc i64 %L to i32108  store i32 %T, ptr getelementptr inbounds (%packed.i16i32, ptr @D_align4, i64 0, i32 1), align 4109  ret void110}111 112define dso_local void @f8(ptr %Src) {113; CHECK-LABEL: f8:114; CHECK:       # %bb.0:115; CHECK-NEXT:    lg %r0, 0(%r2)116; CHECK-NEXT:    larl %r1, F_align2117; CHECK-NEXT:    sth %r0, 1(%r1)118; CHECK-NEXT:    br %r14119  %L = load i64, ptr %Src120  %T = trunc i64 %L to i16121  store i16 %T, ptr getelementptr inbounds (%packed.i8i16, ptr @F_align2, i64 0, i32 1), align 2122  ret void123}124 125;;; Loads126 127; unaligned packed struct + 2  -> unaligned address128define dso_local i32 @f9() {129; CHECK-LABEL: f9:130; CHECK:       # %bb.0:131; CHECK-NEXT:    larl %r1, A_align2132; CHECK-NEXT:    l %r2, 2(%r1)133; CHECK-NEXT:    br %r14134  %L = load i32, ptr getelementptr inbounds (%packed.i16i32, ptr @A_align2, i64 0, i32 1), align 4135  ret i32 %L136}137 138; unaligned packed struct  + 8  -> unaligned address139define dso_local i32 @f10() {140; CHECK-LABEL: f10:141; CHECK:       # %bb.0:142; CHECK-NEXT:    larl %r1, B_align2143; CHECK-NEXT:    l %r2, 8(%r1)144; CHECK-NEXT:    br %r14145  %L = load i32, ptr getelementptr inbounds (%packed.i16i32i16i32, ptr @B_align2, i64 0, i32 3), align 4146  ret i32 %L147}148 149; aligned packed struct + 2  -> unaligned address150define dso_local i32 @f11() {151; CHECK-LABEL: f11:152; CHECK:       # %bb.0:153; CHECK-NEXT:    larl %r1, D_align4154; CHECK-NEXT:    l %r2, 2(%r1)155; CHECK-NEXT:    br %r14156  %L = load i32, ptr getelementptr inbounds (%packed.i16i32, ptr @D_align4, i64 0, i32 1), align 4157  ret i32 %L158}159 160; aligned packed struct + 8  -> aligned address161define dso_local i32 @f12() {162; CHECK-LABEL: f12:163; CHECK:       # %bb.0:164; CHECK-NEXT:    lrl %r2, E_align4+8165; CHECK-NEXT:    br %r14166  %L = load i32, ptr getelementptr inbounds (%packed.i16i32i16i32, ptr @E_align4, i64 0, i32 3), align 4167  ret i32 %L168}169 170define dso_local i64 @f13() {171; CHECK-LABEL: f13:172; CHECK:       # %bb.0:173; CHECK-NEXT:    larl %r1, C_align2174; CHECK-NEXT:    lg %r2, 2(%r1)175; CHECK-NEXT:    br %r14176  %L = load i64, ptr getelementptr inbounds (%packed.i16i64, ptr @C_align2, i64 0, i32 1), align 8177  ret i64 %L178}179 180define dso_local i32 @f14() {181; CHECK-LABEL: f14:182; CHECK:       # %bb.0:183; CHECK-NEXT:    larl %r1, F_align2184; CHECK-NEXT:    lh %r2, 1(%r1)185; CHECK-NEXT:    br %r14186  %L = load i16, ptr getelementptr inbounds (%packed.i8i16, ptr @F_align2, i64 0, i32 1), align 2187  %ext = sext i16 %L to i32188  ret i32 %ext189}190 191define dso_local i64 @f15() {192; CHECK-LABEL: f15:193; CHECK:       # %bb.0:194; CHECK-NEXT:    larl %r1, F_align2195; CHECK-NEXT:    llgh %r2, 1(%r1)196; CHECK-NEXT:    br %r14197  %L = load i16, ptr getelementptr inbounds (%packed.i8i16, ptr @F_align2, i64 0, i32 1), align 2198  %ext = zext i16 %L to i64199  ret i64 %ext200}201 202;;; Loads folded into compare instructions203 204define dso_local i32 @f16(i32 %src1) {205; CHECK-LABEL: f16:206; CHECK:       # %bb.0: # %entry207; CHECK-NEXT:    larl %r1, A_align2208; CHECK-NEXT:    c %r2, 2(%r1)209; CHECK-NEXT:    blr %r14210; CHECK-NEXT:  .LBB15_1: # %mulb211; CHECK-NEXT:    msr %r2, %r2212; CHECK-NEXT:    br %r14213entry:214  %src2 = load i32, ptr getelementptr inbounds (%packed.i16i32, ptr @A_align2, i64 0, i32 1), align 4215  %cond = icmp slt i32 %src1, %src2216  br i1 %cond, label %exit, label %mulb217mulb:218  %mul = mul i32 %src1, %src1219  br label %exit220exit:221  %res = phi i32 [ %src1, %entry ], [ %mul, %mulb ]222  ret i32 %res223}224 225define dso_local i64 @f17(i64 %src1) {226; CHECK-LABEL: f17:227; CHECK:       # %bb.0: # %entry228; CHECK-NEXT:    larl %r1, C_align2229; CHECK-NEXT:    clg %r2, 2(%r1)230; CHECK-NEXT:    blr %r14231; CHECK-NEXT:  .LBB16_1: # %mulb232; CHECK-NEXT:    msgr %r2, %r2233; CHECK-NEXT:    br %r14234entry:235  %src2 = load i64, ptr getelementptr inbounds (%packed.i16i64, ptr @C_align2, i64 0, i32 1), align 8236  %cond = icmp ult i64 %src1, %src2237  br i1 %cond, label %exit, label %mulb238mulb:239  %mul = mul i64 %src1, %src1240  br label %exit241exit:242  %res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]243  ret i64 %res244}245