brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.4 KiB · 3fc7c59 Raw
195 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -passes=infer-alignment -S | FileCheck %s3%struct.S1 = type { %struct.float3, %struct.float3, i32, i32 }4%struct.float3 = type { float, float, float }5 6 7; ------------------------------------------------------------------------------8; Test that we can propagate the align 16 to the load and store that are set to align 49; ------------------------------------------------------------------------------10 11define void @prop_align(ptr %v, ptr %vout) {12; CHECK-LABEL: define void @prop_align(13; CHECK-SAME: ptr [[V:%.*]], ptr [[VOUT:%.*]]) {14; CHECK-NEXT:    [[DOTUNPACK_UNPACK:%.*]] = load float, ptr [[V]], align 1615; CHECK-NEXT:    [[DOTUNPACK_ELT7:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 416; CHECK-NEXT:    [[DOTUNPACK_UNPACK8:%.*]] = load float, ptr [[DOTUNPACK_ELT7]], align 417; CHECK-NEXT:    [[DOTUNPACK_ELT9:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 818; CHECK-NEXT:    [[DOTUNPACK_UNPACK10:%.*]] = load float, ptr [[DOTUNPACK_ELT9]], align 819; CHECK-NEXT:    [[DOTELT1:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 1220; CHECK-NEXT:    [[DOTUNPACK2_UNPACK:%.*]] = load float, ptr [[DOTELT1]], align 421; CHECK-NEXT:    [[DOTUNPACK2_ELT12:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 1622; CHECK-NEXT:    [[DOTUNPACK2_UNPACK13:%.*]] = load float, ptr [[DOTUNPACK2_ELT12]], align 1623; CHECK-NEXT:    [[DOTUNPACK2_ELT14:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 2024; CHECK-NEXT:    [[DOTUNPACK2_UNPACK15:%.*]] = load float, ptr [[DOTUNPACK2_ELT14]], align 425; CHECK-NEXT:    [[DOTELT3:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 2426; CHECK-NEXT:    [[DOTUNPACK4:%.*]] = load i32, ptr [[DOTELT3]], align 827; CHECK-NEXT:    [[DOTELT5:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 2828; CHECK-NEXT:    [[DOTUNPACK6:%.*]] = load i32, ptr [[DOTELT5]], align 429; CHECK-NEXT:    store float [[DOTUNPACK_UNPACK]], ptr [[VOUT]], align 1630; CHECK-NEXT:    [[VOUT_REPACK23:%.*]] = getelementptr inbounds nuw i8, ptr [[VOUT]], i64 431; CHECK-NEXT:    store float [[DOTUNPACK_UNPACK8]], ptr [[VOUT_REPACK23]], align 432; CHECK-NEXT:    [[VOUT_REPACK25:%.*]] = getelementptr inbounds nuw i8, ptr [[VOUT]], i64 833; CHECK-NEXT:    store float [[DOTUNPACK_UNPACK10]], ptr [[VOUT_REPACK25]], align 834; CHECK-NEXT:    [[VOUT_REPACK17:%.*]] = getelementptr inbounds nuw i8, ptr [[VOUT]], i64 1235; CHECK-NEXT:    store float [[DOTUNPACK2_UNPACK]], ptr [[VOUT_REPACK17]], align 436; CHECK-NEXT:    [[VOUT_REPACK17_REPACK27:%.*]] = getelementptr inbounds nuw i8, ptr [[VOUT]], i64 1637; CHECK-NEXT:    store float [[DOTUNPACK2_UNPACK13]], ptr [[VOUT_REPACK17_REPACK27]], align 1638; CHECK-NEXT:    [[VOUT_REPACK17_REPACK29:%.*]] = getelementptr inbounds nuw i8, ptr [[VOUT]], i64 2039; CHECK-NEXT:    store float [[DOTUNPACK2_UNPACK15]], ptr [[VOUT_REPACK17_REPACK29]], align 440; CHECK-NEXT:    [[VOUT_REPACK19:%.*]] = getelementptr inbounds nuw i8, ptr [[VOUT]], i64 2441; CHECK-NEXT:    store i32 [[DOTUNPACK4]], ptr [[VOUT_REPACK19]], align 842; CHECK-NEXT:    [[VOUT_REPACK21:%.*]] = getelementptr inbounds nuw i8, ptr [[VOUT]], i64 2843; CHECK-NEXT:    store i32 [[DOTUNPACK6]], ptr [[VOUT_REPACK21]], align 444; CHECK-NEXT:    ret void45;46  %.unpack.unpack = load float, ptr %v, align 1647  %.unpack.elt7 = getelementptr inbounds nuw i8, ptr %v, i64 448  %.unpack.unpack8 = load float, ptr %.unpack.elt7, align 449  %.unpack.elt9 = getelementptr inbounds nuw i8, ptr %v, i64 850  %.unpack.unpack10 = load float, ptr %.unpack.elt9, align 851  %.elt1 = getelementptr inbounds nuw i8, ptr %v, i64 1252  %.unpack2.unpack = load float, ptr %.elt1, align 453  %.unpack2.elt12 = getelementptr inbounds nuw i8, ptr %v, i64 1654  %.unpack2.unpack13 = load float, ptr %.unpack2.elt12, align 455  %.unpack2.elt14 = getelementptr inbounds nuw i8, ptr %v, i64 2056  %.unpack2.unpack15 = load float, ptr %.unpack2.elt14, align 457  %.elt3 = getelementptr inbounds nuw i8, ptr %v, i64 2458  %.unpack4 = load i32, ptr %.elt3, align 859  %.elt5 = getelementptr inbounds nuw i8, ptr %v, i64 2860  %.unpack6 = load i32, ptr %.elt5, align 461  store float %.unpack.unpack, ptr %vout, align 1662  %vout.repack23 = getelementptr inbounds nuw i8, ptr %vout, i64 463  store float %.unpack.unpack8, ptr %vout.repack23, align 464  %vout.repack25 = getelementptr inbounds nuw i8, ptr %vout, i64 865  store float %.unpack.unpack10, ptr %vout.repack25, align 866  %vout.repack17 = getelementptr inbounds nuw i8, ptr %vout, i64 1267  store float %.unpack2.unpack, ptr %vout.repack17, align 468  %vout.repack17.repack27 = getelementptr inbounds nuw i8, ptr %vout, i64 1669  store float %.unpack2.unpack13, ptr %vout.repack17.repack27, align 470  %vout.repack17.repack29 = getelementptr inbounds nuw i8, ptr %vout, i64 2071  store float %.unpack2.unpack15, ptr %vout.repack17.repack29, align 472  %vout.repack19 = getelementptr inbounds nuw i8, ptr %vout, i64 2473  store i32 %.unpack4, ptr %vout.repack19, align 874  %vout.repack21 = getelementptr inbounds nuw i8, ptr %vout, i64 2875  store i32 %.unpack6, ptr %vout.repack21, align 476  ret void77}78 79; ------------------------------------------------------------------------------80; Test that alignment is not propagated from a source that does not dominate the destination81; ------------------------------------------------------------------------------82 83define void @no_prop_align(ptr %v, ptr %vout, i1 %cond) {84; CHECK-LABEL: define void @no_prop_align(85; CHECK-SAME: ptr [[V:%.*]], ptr [[VOUT:%.*]], i1 [[COND:%.*]]) {86; CHECK-NEXT:    br i1 [[COND]], label %[[BRANCH1:.*]], label %[[BRANCH2:.*]]87; CHECK:       [[BRANCH1]]:88; CHECK-NEXT:    [[DOTUNPACK_UNPACK:%.*]] = load float, ptr [[V]], align 1689; CHECK-NEXT:    [[DOTUNPACK_ELT7:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 490; CHECK-NEXT:    [[DOTUNPACK_UNPACK8:%.*]] = load float, ptr [[DOTUNPACK_ELT7]], align 491; CHECK-NEXT:    [[DOTUNPACK_ELT9:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 892; CHECK-NEXT:    [[DOTUNPACK_UNPACK10:%.*]] = load float, ptr [[DOTUNPACK_ELT9]], align 893; CHECK-NEXT:    [[DOTELT1:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 1294; CHECK-NEXT:    [[DOTUNPACK2_UNPACK:%.*]] = load float, ptr [[DOTELT1]], align 495; CHECK-NEXT:    br label %[[END:.*]]96; CHECK:       [[BRANCH2]]:97; CHECK-NEXT:    [[DOTUNPACK2_ELT12:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 1698; CHECK-NEXT:    [[DOTUNPACK2_UNPACK13:%.*]] = load float, ptr [[DOTUNPACK2_ELT12]], align 499; CHECK-NEXT:    [[DOTUNPACK2_ELT14:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 20100; CHECK-NEXT:    [[DOTUNPACK2_UNPACK15:%.*]] = load float, ptr [[DOTUNPACK2_ELT14]], align 4101; CHECK-NEXT:    [[DOTELT3:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 24102; CHECK-NEXT:    [[DOTUNPACK4:%.*]] = load i32, ptr [[DOTELT3]], align 8103; CHECK-NEXT:    [[DOTELT5:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 28104; CHECK-NEXT:    [[DOTUNPACK6:%.*]] = load i32, ptr [[DOTELT5]], align 4105; CHECK-NEXT:    br label %[[END]]106; CHECK:       [[END]]:107; CHECK-NEXT:    ret void108;109  br i1 %cond, label %branch1, label %branch2110 111branch1:112  %.unpack.unpack = load float, ptr %v, align 16113  %.unpack.elt7 = getelementptr inbounds nuw i8, ptr %v, i64 4114  %.unpack.unpack8 = load float, ptr %.unpack.elt7, align 4115  %.unpack.elt9 = getelementptr inbounds nuw i8, ptr %v, i64 8116  %.unpack.unpack10 = load float, ptr %.unpack.elt9, align 8117  %.elt1 = getelementptr inbounds nuw i8, ptr %v, i64 12118  %.unpack2.unpack = load float, ptr %.elt1, align 4119  br label %end120 121branch2:122  %.unpack2.elt12 = getelementptr inbounds nuw i8, ptr %v, i64 16123  %.unpack2.unpack13 = load float, ptr %.unpack2.elt12, align 4124  %.unpack2.elt14 = getelementptr inbounds nuw i8, ptr %v, i64 20125  %.unpack2.unpack15 = load float, ptr %.unpack2.elt14, align 4126  %.elt3 = getelementptr inbounds nuw i8, ptr %v, i64 24127  %.unpack4 = load i32, ptr %.elt3, align 8128  %.elt5 = getelementptr inbounds nuw i8, ptr %v, i64 28129  %.unpack6 = load i32, ptr %.elt5, align 4130  br label %end131 132end:133  ret void134}135 136; ------------------------------------------------------------------------------137; Test that we can propagate to/from negative offset GEPs138; ------------------------------------------------------------------------------139 140define void @prop_align_negative_offset(ptr %v) {141; CHECK-LABEL: define void @prop_align_negative_offset(142; CHECK-SAME: ptr [[V:%.*]]) {143; CHECK-NEXT:    [[LOADALIGNED:%.*]] = load float, ptr [[V]], align 16144; CHECK-NEXT:    [[GEPNEGATIVE:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 -16145; CHECK-NEXT:    [[LOADUNALIGNED:%.*]] = load float, ptr [[GEPNEGATIVE]], align 16146; CHECK-NEXT:    ret void147;148  %loadAligned= load float, ptr %v, align 16149  %gepNegative = getelementptr inbounds nuw i8, ptr %v, i64 -16150  %loadUnaligned = load float, ptr %gepNegative, align 4151  ret void152}153 154define void @prop_align_negative_offset_2(ptr %v) {155; CHECK-LABEL: define void @prop_align_negative_offset_2(156; CHECK-SAME: ptr [[V:%.*]]) {157; CHECK-NEXT:    [[GEPNEGATIVE:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 -16158; CHECK-NEXT:    [[LOADALIGNED:%.*]] = load float, ptr [[GEPNEGATIVE]], align 16159; CHECK-NEXT:    [[LOADUNALIGNED:%.*]] = load float, ptr [[V]], align 16160; CHECK-NEXT:    ret void161;162  %gepNegative = getelementptr inbounds nuw i8, ptr %v, i64 -16163  %loadAligned = load float, ptr %gepNegative, align 16164  %loadUnaligned= load float, ptr %v, align 4165  ret void166}167 168define void @prop_align_negative_offset_3(ptr %v) {169; CHECK-LABEL: define void @prop_align_negative_offset_3(170; CHECK-SAME: ptr [[V:%.*]]) {171; CHECK-NEXT:    [[LOADALIGNED:%.*]] = load float, ptr [[V]], align 16172; CHECK-NEXT:    [[GEPNEGATIVE:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 -8173; CHECK-NEXT:    [[LOADUNALIGNED:%.*]] = load float, ptr [[GEPNEGATIVE]], align 8174; CHECK-NEXT:    ret void175;176  %loadAligned= load float, ptr %v, align 16177  %gepNegative = getelementptr inbounds nuw i8, ptr %v, i64 -8178  %loadUnaligned = load float, ptr %gepNegative, align 4179  ret void180}181 182define void @prop_align_negative_offset_4(ptr %v) {183; CHECK-LABEL: define void @prop_align_negative_offset_4(184; CHECK-SAME: ptr [[V:%.*]]) {185; CHECK-NEXT:    [[LOADALIGNED:%.*]] = load float, ptr [[V]], align 16186; CHECK-NEXT:    [[GEPNEGATIVE:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 -20187; CHECK-NEXT:    [[LOADUNALIGNED:%.*]] = load float, ptr [[GEPNEGATIVE]], align 4188; CHECK-NEXT:    ret void189;190  %loadAligned= load float, ptr %v, align 16191  %gepNegative = getelementptr inbounds nuw i8, ptr %v, i64 -20192  %loadUnaligned = load float, ptr %gepNegative, align 4193  ret void194}195