121 lines · plain
1; RUN: opt -passes=consthoist -S -o - %s | FileCheck %s2target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"3target triple = "thumbv6m-none--musleabi"4 5; Check that for i8 type, the maximum legal offset is 31.6; Also check that an constant used as value to be stored rather than7; pointer in a store instruction is hoisted.8; CHECK: foo_i89; CHECK-DAG: %[[C1:const[0-9]?]] = bitcast i32 805874720 to i3210; CHECK-DAG: %[[C2:const[0-9]?]] = bitcast i32 805874688 to i3211; CHECK-DAG: %[[C3:const[0-9]?]] = bitcast i32 805873720 to i3212; CHECK-DAG: %[[C4:const[0-9]?]] = bitcast i32 805873688 to i3213; CHECK: %0 = inttoptr i32 %[[C2]] to ptr14; CHECK-NEXT: %1 = load volatile i8, ptr %015; CHECK-NEXT: %[[M1:const_mat[0-9]?]] = add i32 %[[C2]], 416; CHECK-NEXT: %2 = inttoptr i32 %[[M1]] to ptr17; CHECK-NEXT: %3 = load volatile i8, ptr %218; CHECK-NEXT: %[[M2:const_mat[0-9]?]] = add i32 %[[C2]], 3119; CHECK-NEXT: %4 = inttoptr i32 %[[M2]] to ptr20; CHECK-NEXT: %5 = load volatile i8, ptr %421; CHECK-NEXT: %6 = inttoptr i32 %[[C1]] to ptr22; CHECK-NEXT: %7 = load volatile i8, ptr %623; CHECK-NEXT: %[[M3:const_mat[0-9]?]] = add i32 %[[C1]], 724; CHECK-NEXT: %8 = inttoptr i32 %[[M3]] to ptr25; CHECK-NEXT: %9 = load volatile i8, ptr %826; CHECK-NEXT: %10 = inttoptr i32 %[[C4]] to ptr27; CHECK-NEXT: store i8 %9, ptr %1028; CHECK-NEXT: %[[M4:const_mat[0-9]?]] = add i32 %[[C4]], 3129; CHECK-NEXT: %11 = inttoptr i32 %[[M4]] to ptr30; CHECK-NEXT: store i8 %7, ptr %1131; CHECK-NEXT: %12 = inttoptr i32 %[[C3]] to ptr32; CHECK-NEXT: store i8 %5, ptr %1233; CHECK-NEXT: %[[M5:const_mat[0-9]?]] = add i32 %[[C3]], 734; CHECK-NEXT: %13 = inttoptr i32 %[[M5]] to ptr35; CHECK-NEXT: store i8 %3, ptr %1336; CHECK-NEXT: %[[M6:const_mat[0-9]?]] = add i32 %[[C1]], 8037; CHECK-NEXT: %14 = inttoptr i32 %[[M6]] to ptr38; CHECK-NEXT: store ptr %14, ptr @goo39 40@goo = global ptr undef41 42define void @foo_i8() {43entry:44 %0 = load volatile i8, ptr inttoptr (i32 805874688 to ptr)45 %1 = load volatile i8, ptr inttoptr (i32 805874692 to ptr)46 %2 = load volatile i8, ptr inttoptr (i32 805874719 to ptr)47 %3 = load volatile i8, ptr inttoptr (i32 805874720 to ptr)48 %4 = load volatile i8, ptr inttoptr (i32 805874727 to ptr)49 store i8 %4, ptr inttoptr(i32 805873688 to ptr)50 store i8 %3, ptr inttoptr(i32 805873719 to ptr)51 store i8 %2, ptr inttoptr(i32 805873720 to ptr)52 store i8 %1, ptr inttoptr(i32 805873727 to ptr)53 store ptr inttoptr(i32 805874800 to ptr), ptr @goo54 ret void55}56 57; Check that for i16 type, the maximum legal offset is 62.58; CHECK: foo_i1659; CHECK-DAG: %[[C1:const[0-9]?]] = bitcast i32 805874752 to i3260; CHECK-DAG: %[[C2:const[0-9]?]] = bitcast i32 805874688 to i3261; CHECK: %0 = inttoptr i32 %[[C2]] to ptr62; CHECK-NEXT: %1 = load volatile i16, ptr %0, align 263; CHECK-NEXT: %[[M1:const_mat[0-9]?]] = add i32 %[[C2]], 464; CHECK-NEXT: %2 = inttoptr i32 %[[M1]] to ptr65; CHECK-NEXT: %3 = load volatile i16, ptr %2, align 266; CHECK-NEXT: %[[M2:const_mat[0-9]?]] = add i32 %[[C2]], 3267; CHECK-NEXT: %4 = inttoptr i32 %[[M2]] to ptr68; CHECK-NEXT: %5 = load volatile i16, ptr %4, align 269; CHECK-NEXT: %[[M3:const_mat[0-9]?]] = add i32 %[[C2]], 6270; CHECK-NEXT: %6 = inttoptr i32 %[[M3]] to ptr71; CHECK-NEXT: %7 = load volatile i16, ptr %6, align 272; CHECK-NEXT: %8 = inttoptr i32 %[[C1]] to ptr73; CHECK-NEXT: %9 = load volatile i16, ptr %8, align 274; CHECK-NEXT: %[[M4:const_mat[0-9]?]] = add i32 %[[C1]], 2275; CHECK-NEXT: %10 = inttoptr i32 %[[M4]] to ptr76; CHECK-NEXT: %11 = load volatile i16, ptr %10, align 277 78define void @foo_i16() {79entry:80 %0 = load volatile i16, ptr inttoptr (i32 805874688 to ptr), align 281 %1 = load volatile i16, ptr inttoptr (i32 805874692 to ptr), align 282 %2 = load volatile i16, ptr inttoptr (i32 805874720 to ptr), align 283 %3 = load volatile i16, ptr inttoptr (i32 805874750 to ptr), align 284 %4 = load volatile i16, ptr inttoptr (i32 805874752 to ptr), align 285 %5 = load volatile i16, ptr inttoptr (i32 805874774 to ptr), align 286 ret void87}88 89; Check that for i32 type, the maximum legal offset is 124.90; CHECK: foo_i3291; CHECK-DAG: %[[C1:const[0-9]?]] = bitcast i32 805874816 to i3292; CHECK-DAG: %[[C2:const[0-9]?]] = bitcast i32 805874688 to i3293; CHECK: %0 = inttoptr i32 %[[C2]] to ptr94; CHECK-NEXT: %1 = load volatile i32, ptr %0, align 495; CHECK-NEXT: %[[M1:const_mat[0-9]?]] = add i32 %[[C2]], 496; CHECK-NEXT: %2 = inttoptr i32 %[[M1]] to ptr97; CHECK-NEXT: %3 = load volatile i32, ptr %2, align 498; CHECK-NEXT: %[[M2:const_mat[0-9]?]] = add i32 %[[C2]], 12499; CHECK-NEXT: %4 = inttoptr i32 %[[M2]] to ptr100; CHECK-NEXT: %5 = load volatile i32, ptr %4, align 4101; CHECK-NEXT: %6 = inttoptr i32 %[[C1]] to ptr102; CHECK-NEXT: %7 = load volatile i32, ptr %6, align 4103; CHECK-NEXT: %[[M3:const_mat[0-9]?]] = add i32 %[[C1]], 8104; CHECK-NEXT: %8 = inttoptr i32 %[[M3]] to ptr105; CHECK-NEXT: %9 = load volatile i32, ptr %8, align 4106; CHECK-NEXT: %[[M4:const_mat[0-9]?]] = add i32 %[[C1]], 12107; CHECK-NEXT: %10 = inttoptr i32 %[[M4]] to ptr108; CHECK-NEXT: %11 = load volatile i32, ptr %10, align 4109 110define void @foo_i32() {111entry:112 %0 = load volatile i32, ptr inttoptr (i32 805874688 to ptr), align 4113 %1 = load volatile i32, ptr inttoptr (i32 805874692 to ptr), align 4114 %2 = load volatile i32, ptr inttoptr (i32 805874812 to ptr), align 4115 %3 = load volatile i32, ptr inttoptr (i32 805874816 to ptr), align 4116 %4 = load volatile i32, ptr inttoptr (i32 805874824 to ptr), align 4117 %5 = load volatile i32, ptr inttoptr (i32 805874828 to ptr), align 4118 ret void119}120 121