brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · bceadea Raw
80 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=globalopt -S < %s | FileCheck %s3 4@G1 = internal global i32 55@G2 = internal global i32 56@G3 = internal global i32 57@G4 = internal global i32 58@G5 = internal global i32 59 10define i32 @test1() norecurse {11; CHECK-LABEL: @test1(12; CHECK-NEXT:    [[G1:%.*]] = alloca i32, align 413; CHECK-NEXT:    store i32 5, ptr [[G1]], align 414; CHECK-NEXT:    store i32 4, ptr [[G1]], align 415; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[G1]], align 416; CHECK-NEXT:    ret i32 [[A]]17;18  store i32 4, ptr @G119  %a = load i32, ptr @G120  ret i32 %a21}22 23; The load comes before the store which makes @G2 live before the call.24define i32 @test2() norecurse {25; CHECK-LABEL: @test2(26; CHECK-NEXT:    [[A_B:%.*]] = load i1, ptr @G2, align 127; CHECK-NEXT:    [[A:%.*]] = select i1 [[A_B]], i32 4, i32 528; CHECK-NEXT:    store i1 true, ptr @G2, align 129; CHECK-NEXT:    ret i32 [[A]]30;31  %a = load i32, ptr @G232  store i32 4, ptr @G233  ret i32 %a34}35 36; This global is indexed by a GEP - this makes it partial alias and we bail out.37; FIXME: We don't actually have to bail out in this case.38define i32 @test3() norecurse {39; CHECK-LABEL: @test3(40; CHECK-NEXT:    [[A_B:%.*]] = load i1, ptr @G3, align 141; CHECK-NEXT:    [[A:%.*]] = select i1 [[A_B]], i32 4, i32 542; CHECK-NEXT:    store i1 true, ptr @G3, align 143; CHECK-NEXT:    ret i32 [[A]]44;45  %a = load i32, ptr @G346  store i32 4, ptr @G347  ret i32 %a48}49 50; The global is casted away to a larger type then loaded. The store only partially51; covers the load, so we must not demote.52define i32 @test4() norecurse {53; CHECK-LABEL: @test4(54; CHECK-NEXT:    store i32 4, ptr @G4, align 455; CHECK-NEXT:    [[A:%.*]] = load i64, ptr @G4, align 456; CHECK-NEXT:    [[B:%.*]] = trunc i64 [[A]] to i3257; CHECK-NEXT:    ret i32 [[B]]58;59  store i32 4, ptr @G460  %a = load i64, ptr @G461  %b = trunc i64 %a to i3262  ret i32 %b63}64 65; The global is casted away to a smaller type then loaded. This one is fine.66define i32 @test5() norecurse {67; CHECK-LABEL: @test5(68; CHECK-NEXT:    [[G5:%.*]] = alloca i32, align 469; CHECK-NEXT:    store i32 5, ptr [[G5]], align 470; CHECK-NEXT:    store i32 4, ptr [[G5]], align 471; CHECK-NEXT:    [[A:%.*]] = load i16, ptr [[G5]], align 272; CHECK-NEXT:    [[B:%.*]] = zext i16 [[A]] to i3273; CHECK-NEXT:    ret i32 [[B]]74;75  store i32 4, ptr @G576  %a = load i16, ptr @G577  %b = zext i16 %a to i3278  ret i32 %b79}80