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