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