777 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=aarch64 -verify-machineinstrs --mattr=+cpa -aarch64-use-featcpa-codegen=true -O0 -global-isel=1 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK-CPA-O03; RUN: llc -mtriple=aarch64 -verify-machineinstrs --mattr=+cpa -aarch64-use-featcpa-codegen=true -O3 -global-isel=1 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK-CPA-O34; RUN: llc -mtriple=aarch64 -verify-machineinstrs --mattr=-cpa -O0 -global-isel=1 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK-NOCPA-O05; RUN: llc -mtriple=aarch64 -verify-machineinstrs --mattr=-cpa -O3 -global-isel=1 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK-NOCPA-O36 7%struct.my_type = type { i64, i64 }8%struct.my_type2 = type { i64, i64, i64, i64, i64, i64 }9 10@array = external dso_local global [10 x %struct.my_type], align 811@array2 = external dso_local global [10 x %struct.my_type2], align 812 13define void @addpt1(i64 %index, i64 %arg) {14; CHECK-CPA-O0-LABEL: addpt1:15; CHECK-CPA-O0: // %bb.0: // %entry16; CHECK-CPA-O0-NEXT: adrp x8, array17; CHECK-CPA-O0-NEXT: add x8, x8, :lo12:array18; CHECK-CPA-O0-NEXT: addpt x8, x8, x0, lsl #419; CHECK-CPA-O0-NEXT: str x1, [x8, #8]20; CHECK-CPA-O0-NEXT: ret21;22; CHECK-CPA-O3-LABEL: addpt1:23; CHECK-CPA-O3: // %bb.0: // %entry24; CHECK-CPA-O3-NEXT: adrp x8, array25; CHECK-CPA-O3-NEXT: add x8, x8, :lo12:array26; CHECK-CPA-O3-NEXT: addpt x8, x8, x0, lsl #427; CHECK-CPA-O3-NEXT: str x1, [x8, #8]28; CHECK-CPA-O3-NEXT: ret29;30; CHECK-NOCPA-O0-LABEL: addpt1:31; CHECK-NOCPA-O0: // %bb.0: // %entry32; CHECK-NOCPA-O0-NEXT: adrp x8, array33; CHECK-NOCPA-O0-NEXT: add x8, x8, :lo12:array34; CHECK-NOCPA-O0-NEXT: add x8, x8, x0, lsl #435; CHECK-NOCPA-O0-NEXT: str x1, [x8, #8]36; CHECK-NOCPA-O0-NEXT: ret37;38; CHECK-NOCPA-O3-LABEL: addpt1:39; CHECK-NOCPA-O3: // %bb.0: // %entry40; CHECK-NOCPA-O3-NEXT: adrp x8, array41; CHECK-NOCPA-O3-NEXT: add x8, x8, :lo12:array42; CHECK-NOCPA-O3-NEXT: add x8, x8, x0, lsl #443; CHECK-NOCPA-O3-NEXT: str x1, [x8, #8]44; CHECK-NOCPA-O3-NEXT: ret45entry:46 %e2 = getelementptr inbounds %struct.my_type, ptr @array, i64 %index, i32 147 store i64 %arg, ptr %e2, align 848 ret void49}50 51define void @maddpt1(i32 %pos, ptr %val) {52; CHECK-CPA-O0-LABEL: maddpt1:53; CHECK-CPA-O0: // %bb.0: // %entry54; CHECK-CPA-O0-NEXT: // implicit-def: $x855; CHECK-CPA-O0-NEXT: mov w8, w056; CHECK-CPA-O0-NEXT: sxtw x8, w857; CHECK-CPA-O0-NEXT: mov w9, #48 // =0x3058; CHECK-CPA-O0-NEXT: // kill: def $x9 killed $w959; CHECK-CPA-O0-NEXT: adrp x10, array260; CHECK-CPA-O0-NEXT: add x10, x10, :lo12:array261; CHECK-CPA-O0-NEXT: maddpt x0, x8, x9, x1062; CHECK-CPA-O0-NEXT: mov w8, #48 // =0x3063; CHECK-CPA-O0-NEXT: mov w2, w864; CHECK-CPA-O0-NEXT: b memcpy65;66; CHECK-CPA-O3-LABEL: maddpt1:67; CHECK-CPA-O3: // %bb.0: // %entry68; CHECK-CPA-O3-NEXT: // kill: def $w0 killed $w0 def $x069; CHECK-CPA-O3-NEXT: sxtw x9, w070; CHECK-CPA-O3-NEXT: mov w8, #48 // =0x3071; CHECK-CPA-O3-NEXT: ldr q0, [x1]72; CHECK-CPA-O3-NEXT: adrp x10, array273; CHECK-CPA-O3-NEXT: add x10, x10, :lo12:array274; CHECK-CPA-O3-NEXT: maddpt x8, x9, x8, x1075; CHECK-CPA-O3-NEXT: str q0, [x8]76; CHECK-CPA-O3-NEXT: ldr q0, [x1, #16]77; CHECK-CPA-O3-NEXT: str q0, [x8, #16]78; CHECK-CPA-O3-NEXT: ldr q0, [x1, #32]79; CHECK-CPA-O3-NEXT: str q0, [x8, #32]80; CHECK-CPA-O3-NEXT: ret81;82; CHECK-NOCPA-O0-LABEL: maddpt1:83; CHECK-NOCPA-O0: // %bb.0: // %entry84; CHECK-NOCPA-O0-NEXT: adrp x9, array285; CHECK-NOCPA-O0-NEXT: add x9, x9, :lo12:array286; CHECK-NOCPA-O0-NEXT: mov w8, #48 // =0x3087; CHECK-NOCPA-O0-NEXT: smaddl x0, w0, w8, x988; CHECK-NOCPA-O0-NEXT: mov w8, #48 // =0x3089; CHECK-NOCPA-O0-NEXT: mov w2, w890; CHECK-NOCPA-O0-NEXT: b memcpy91;92; CHECK-NOCPA-O3-LABEL: maddpt1:93; CHECK-NOCPA-O3: // %bb.0: // %entry94; CHECK-NOCPA-O3-NEXT: mov w8, #48 // =0x3095; CHECK-NOCPA-O3-NEXT: adrp x9, array296; CHECK-NOCPA-O3-NEXT: add x9, x9, :lo12:array297; CHECK-NOCPA-O3-NEXT: smaddl x8, w0, w8, x998; CHECK-NOCPA-O3-NEXT: ldr q0, [x1]99; CHECK-NOCPA-O3-NEXT: str q0, [x8]100; CHECK-NOCPA-O3-NEXT: ldr q0, [x1, #16]101; CHECK-NOCPA-O3-NEXT: str q0, [x8, #16]102; CHECK-NOCPA-O3-NEXT: ldr q0, [x1, #32]103; CHECK-NOCPA-O3-NEXT: str q0, [x8, #32]104; CHECK-NOCPA-O3-NEXT: ret105entry:106 %idxprom = sext i32 %pos to i64107 %arrayidx = getelementptr inbounds [10 x %struct.my_type2], ptr @array2, i64 0, i64 %idxprom108 tail call void @llvm.memcpy.p0.p0.i64(ptr align 8 dereferenceable(48) %arrayidx, ptr align 8 dereferenceable(48) %val, i64 48, i1 false)109 ret void110}111 112define void @msubpt1(i32 %index, i32 %elem) {113; CHECK-CPA-O0-LABEL: msubpt1:114; CHECK-CPA-O0: // %bb.0: // %entry115; CHECK-CPA-O0-NEXT: // implicit-def: $x8116; CHECK-CPA-O0-NEXT: mov w8, w0117; CHECK-CPA-O0-NEXT: sxtw x10, w8118; CHECK-CPA-O0-NEXT: mov w8, #48 // =0x30119; CHECK-CPA-O0-NEXT: mov w9, w8120; CHECK-CPA-O0-NEXT: mov w8, #288 // =0x120121; CHECK-CPA-O0-NEXT: mov w11, w8122; CHECK-CPA-O0-NEXT: adrp x8, array2123; CHECK-CPA-O0-NEXT: add x8, x8, :lo12:array2124; CHECK-CPA-O0-NEXT: addpt x11, x8, x11125; CHECK-CPA-O0-NEXT: msubpt x0, x9, x10, x11126; CHECK-CPA-O0-NEXT: mov w9, #48 // =0x30127; CHECK-CPA-O0-NEXT: mov w2, w9128; CHECK-CPA-O0-NEXT: mov w9, #96 // =0x60129; CHECK-CPA-O0-NEXT: // kill: def $x9 killed $w9130; CHECK-CPA-O0-NEXT: addpt x1, x8, x9131; CHECK-CPA-O0-NEXT: b memcpy132;133; CHECK-CPA-O3-LABEL: msubpt1:134; CHECK-CPA-O3: // %bb.0: // %entry135; CHECK-CPA-O3-NEXT: // kill: def $w0 killed $w0 def $x0136; CHECK-CPA-O3-NEXT: sxtw x9, w0137; CHECK-CPA-O3-NEXT: adrp x10, array2+96138; CHECK-CPA-O3-NEXT: add x10, x10, :lo12:array2+96139; CHECK-CPA-O3-NEXT: mov w8, #48 // =0x30140; CHECK-CPA-O3-NEXT: ldr q0, [x10]141; CHECK-CPA-O3-NEXT: msubpt x8, x8, x9, x10142; CHECK-CPA-O3-NEXT: str q0, [x8, #192]143; CHECK-CPA-O3-NEXT: ldr q0, [x10, #16]144; CHECK-CPA-O3-NEXT: str q0, [x8, #208]145; CHECK-CPA-O3-NEXT: ldr q0, [x10, #32]146; CHECK-CPA-O3-NEXT: str q0, [x8, #224]147; CHECK-CPA-O3-NEXT: ret148;149; CHECK-NOCPA-O0-LABEL: msubpt1:150; CHECK-NOCPA-O0: // %bb.0: // %entry151; CHECK-NOCPA-O0-NEXT: // implicit-def: $x8152; CHECK-NOCPA-O0-NEXT: mov w8, w0153; CHECK-NOCPA-O0-NEXT: sxtw x8, w8154; CHECK-NOCPA-O0-NEXT: mov w9, #48 // =0x30155; CHECK-NOCPA-O0-NEXT: // kill: def $x9 killed $w9156; CHECK-NOCPA-O0-NEXT: mneg x10, x8, x9157; CHECK-NOCPA-O0-NEXT: adrp x8, array2158; CHECK-NOCPA-O0-NEXT: add x8, x8, :lo12:array2159; CHECK-NOCPA-O0-NEXT: add x9, x8, #288160; CHECK-NOCPA-O0-NEXT: add x0, x9, x10161; CHECK-NOCPA-O0-NEXT: mov w9, #48 // =0x30162; CHECK-NOCPA-O0-NEXT: mov w2, w9163; CHECK-NOCPA-O0-NEXT: add x1, x8, #96164; CHECK-NOCPA-O0-NEXT: b memcpy165;166; CHECK-NOCPA-O3-LABEL: msubpt1:167; CHECK-NOCPA-O3: // %bb.0: // %entry168; CHECK-NOCPA-O3-NEXT: // kill: def $w0 killed $w0 def $x0169; CHECK-NOCPA-O3-NEXT: sxtw x8, w0170; CHECK-NOCPA-O3-NEXT: mov w9, #48 // =0x30171; CHECK-NOCPA-O3-NEXT: mneg x8, x8, x9172; CHECK-NOCPA-O3-NEXT: adrp x9, array2+96173; CHECK-NOCPA-O3-NEXT: add x9, x9, :lo12:array2+96174; CHECK-NOCPA-O3-NEXT: ldr q0, [x9]175; CHECK-NOCPA-O3-NEXT: add x8, x9, x8176; CHECK-NOCPA-O3-NEXT: str q0, [x8, #192]177; CHECK-NOCPA-O3-NEXT: ldr q0, [x9, #16]178; CHECK-NOCPA-O3-NEXT: str q0, [x8, #208]179; CHECK-NOCPA-O3-NEXT: ldr q0, [x9, #32]180; CHECK-NOCPA-O3-NEXT: str q0, [x8, #224]181; CHECK-NOCPA-O3-NEXT: ret182entry:183 %idx.ext = sext i32 %index to i64184 %idx.neg = sub nsw i64 0, %idx.ext185 %add.ptr = getelementptr inbounds %struct.my_type2, ptr getelementptr inbounds ([10 x %struct.my_type2], ptr @array2, i64 0, i64 6), i64 %idx.neg186 tail call void @llvm.memcpy.p0.p0.i64(ptr align 8 dereferenceable(48) %add.ptr, ptr align 8 dereferenceable(48) getelementptr inbounds ([10 x %struct.my_type2], ptr @array2, i64 0, i64 2), i64 48, i1 false), !tbaa.struct !6187 ret void188}189 190define void @subpt1(i32 %index, i32 %elem) {191; CHECK-CPA-O0-LABEL: subpt1:192; CHECK-CPA-O0: // %bb.0: // %entry193; CHECK-CPA-O0-NEXT: mov w8, #-16 // =0xfffffff0194; CHECK-CPA-O0-NEXT: smull x9, w0, w8195; CHECK-CPA-O0-NEXT: adrp x8, array196; CHECK-CPA-O0-NEXT: add x8, x8, :lo12:array197; CHECK-CPA-O0-NEXT: ldr q0, [x8, #32]198; CHECK-CPA-O0-NEXT: mov w10, #96 // =0x60199; CHECK-CPA-O0-NEXT: // kill: def $x10 killed $w10200; CHECK-CPA-O0-NEXT: addpt x8, x8, x10201; CHECK-CPA-O0-NEXT: str q0, [x8, x9, lsl #4]202; CHECK-CPA-O0-NEXT: ret203;204; CHECK-CPA-O3-LABEL: subpt1:205; CHECK-CPA-O3: // %bb.0: // %entry206; CHECK-CPA-O3-NEXT: mov w8, #-16 // =0xfffffff0207; CHECK-CPA-O3-NEXT: adrp x9, array+32208; CHECK-CPA-O3-NEXT: add x9, x9, :lo12:array+32209; CHECK-CPA-O3-NEXT: smull x8, w0, w8210; CHECK-CPA-O3-NEXT: ldr q0, [x9]211; CHECK-CPA-O3-NEXT: addpt x8, x9, x8, lsl #4212; CHECK-CPA-O3-NEXT: str q0, [x8, #64]213; CHECK-CPA-O3-NEXT: ret214;215; CHECK-NOCPA-O0-LABEL: subpt1:216; CHECK-NOCPA-O0: // %bb.0: // %entry217; CHECK-NOCPA-O0-NEXT: mov w8, #-16 // =0xfffffff0218; CHECK-NOCPA-O0-NEXT: smull x9, w0, w8219; CHECK-NOCPA-O0-NEXT: adrp x8, array220; CHECK-NOCPA-O0-NEXT: add x8, x8, :lo12:array221; CHECK-NOCPA-O0-NEXT: ldr q0, [x8, #32]222; CHECK-NOCPA-O0-NEXT: add x8, x8, #96223; CHECK-NOCPA-O0-NEXT: str q0, [x8, x9, lsl #4]224; CHECK-NOCPA-O0-NEXT: ret225;226; CHECK-NOCPA-O3-LABEL: subpt1:227; CHECK-NOCPA-O3: // %bb.0: // %entry228; CHECK-NOCPA-O3-NEXT: mov w8, #-16 // =0xfffffff0229; CHECK-NOCPA-O3-NEXT: adrp x9, array+32230; CHECK-NOCPA-O3-NEXT: add x9, x9, :lo12:array+32231; CHECK-NOCPA-O3-NEXT: smull x8, w0, w8232; CHECK-NOCPA-O3-NEXT: ldr q0, [x9]233; CHECK-NOCPA-O3-NEXT: add x8, x9, x8, lsl #4234; CHECK-NOCPA-O3-NEXT: str q0, [x8, #64]235; CHECK-NOCPA-O3-NEXT: ret236entry:237 %conv = sext i32 %index to i64238 %mul.neg = mul nsw i64 %conv, -16239 %add.ptr = getelementptr inbounds %struct.my_type, ptr getelementptr inbounds ([10 x %struct.my_type], ptr @array, i64 0, i64 6), i64 %mul.neg240 tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %add.ptr, ptr noundef nonnull align 8 dereferenceable(16) getelementptr inbounds ([10 x %struct.my_type], ptr @array, i64 0, i64 2), i64 16, i1 false), !tbaa.struct !6241 ret void242}243 244define void @subpt2(i32 %index, i32 %elem) {245; CHECK-CPA-O0-LABEL: subpt2:246; CHECK-CPA-O0: // %bb.0: // %entry247; CHECK-CPA-O0-NEXT: mov x8, xzr248; CHECK-CPA-O0-NEXT: subs x9, x8, w0, sxtw249; CHECK-CPA-O0-NEXT: adrp x8, array250; CHECK-CPA-O0-NEXT: add x8, x8, :lo12:array251; CHECK-CPA-O0-NEXT: ldr q0, [x8, #32]252; CHECK-CPA-O0-NEXT: mov w10, #96 // =0x60253; CHECK-CPA-O0-NEXT: // kill: def $x10 killed $w10254; CHECK-CPA-O0-NEXT: addpt x8, x8, x10255; CHECK-CPA-O0-NEXT: str q0, [x8, x9, lsl #4]256; CHECK-CPA-O0-NEXT: ret257;258; CHECK-CPA-O3-LABEL: subpt2:259; CHECK-CPA-O3: // %bb.0: // %entry260; CHECK-CPA-O3-NEXT: mov x8, xzr261; CHECK-CPA-O3-NEXT: adrp x9, array+32262; CHECK-CPA-O3-NEXT: add x9, x9, :lo12:array+32263; CHECK-CPA-O3-NEXT: sub x8, x8, w0, sxtw264; CHECK-CPA-O3-NEXT: ldr q0, [x9]265; CHECK-CPA-O3-NEXT: addpt x8, x9, x8, lsl #4266; CHECK-CPA-O3-NEXT: str q0, [x8, #64]267; CHECK-CPA-O3-NEXT: ret268;269; CHECK-NOCPA-O0-LABEL: subpt2:270; CHECK-NOCPA-O0: // %bb.0: // %entry271; CHECK-NOCPA-O0-NEXT: mov x8, xzr272; CHECK-NOCPA-O0-NEXT: subs x9, x8, w0, sxtw273; CHECK-NOCPA-O0-NEXT: adrp x8, array274; CHECK-NOCPA-O0-NEXT: add x8, x8, :lo12:array275; CHECK-NOCPA-O0-NEXT: ldr q0, [x8, #32]276; CHECK-NOCPA-O0-NEXT: add x8, x8, #96277; CHECK-NOCPA-O0-NEXT: str q0, [x8, x9, lsl #4]278; CHECK-NOCPA-O0-NEXT: ret279;280; CHECK-NOCPA-O3-LABEL: subpt2:281; CHECK-NOCPA-O3: // %bb.0: // %entry282; CHECK-NOCPA-O3-NEXT: mov x8, xzr283; CHECK-NOCPA-O3-NEXT: adrp x9, array+32284; CHECK-NOCPA-O3-NEXT: add x9, x9, :lo12:array+32285; CHECK-NOCPA-O3-NEXT: sub x8, x8, w0, sxtw286; CHECK-NOCPA-O3-NEXT: ldr q0, [x9]287; CHECK-NOCPA-O3-NEXT: add x8, x9, x8, lsl #4288; CHECK-NOCPA-O3-NEXT: str q0, [x8, #64]289; CHECK-NOCPA-O3-NEXT: ret290entry:291 %idx.ext = sext i32 %index to i64292 %idx.neg = sub nsw i64 0, %idx.ext293 %add.ptr = getelementptr inbounds %struct.my_type, ptr getelementptr inbounds ([10 x %struct.my_type], ptr @array, i64 0, i64 6), i64 %idx.neg294 tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %add.ptr, ptr noundef nonnull align 8 dereferenceable(16) getelementptr inbounds ([10 x %struct.my_type], ptr @array, i64 0, i64 2), i64 16, i1 false), !tbaa.struct !11295 ret void296}297 298define ptr @subpt3(ptr %ptr, i32 %index) {299; CHECK-CPA-O0-LABEL: subpt3:300; CHECK-CPA-O0: // %bb.0: // %entry301; CHECK-CPA-O0-NEXT: mov x8, #-8 // =0xfffffffffffffff8302; CHECK-CPA-O0-NEXT: addpt x0, x0, x8303; CHECK-CPA-O0-NEXT: ret304;305; CHECK-CPA-O3-LABEL: subpt3:306; CHECK-CPA-O3: // %bb.0: // %entry307; CHECK-CPA-O3-NEXT: mov x8, #-8 // =0xfffffffffffffff8308; CHECK-CPA-O3-NEXT: addpt x0, x0, x8309; CHECK-CPA-O3-NEXT: ret310;311; CHECK-NOCPA-O0-LABEL: subpt3:312; CHECK-NOCPA-O0: // %bb.0: // %entry313; CHECK-NOCPA-O0-NEXT: subs x0, x0, #8314; CHECK-NOCPA-O0-NEXT: ret315;316; CHECK-NOCPA-O3-LABEL: subpt3:317; CHECK-NOCPA-O3: // %bb.0: // %entry318; CHECK-NOCPA-O3-NEXT: sub x0, x0, #8319; CHECK-NOCPA-O3-NEXT: ret320entry:321 %incdec.ptr.i.i.i = getelementptr inbounds i64, ptr %ptr, i64 -1322 ret ptr %incdec.ptr.i.i.i323}324 325define i64 @subi64(i64 %ptr, i32 %index) {326; CHECK-CPA-O0-LABEL: subi64:327; CHECK-CPA-O0: // %bb.0: // %entry328; CHECK-CPA-O0-NEXT: subs x0, x0, #1329; CHECK-CPA-O0-NEXT: ret330;331; CHECK-CPA-O3-LABEL: subi64:332; CHECK-CPA-O3: // %bb.0: // %entry333; CHECK-CPA-O3-NEXT: sub x0, x0, #1334; CHECK-CPA-O3-NEXT: ret335;336; CHECK-NOCPA-O0-LABEL: subi64:337; CHECK-NOCPA-O0: // %bb.0: // %entry338; CHECK-NOCPA-O0-NEXT: subs x0, x0, #1339; CHECK-NOCPA-O0-NEXT: ret340;341; CHECK-NOCPA-O3-LABEL: subi64:342; CHECK-NOCPA-O3: // %bb.0: // %entry343; CHECK-NOCPA-O3-NEXT: sub x0, x0, #1344; CHECK-NOCPA-O3-NEXT: ret345entry:346 %incdec.ptr.i.i.i = add i64 %ptr, -1347 ret i64 %incdec.ptr.i.i.i348}349 350define i32 @subi32(i32 %ptr, i32 %index) {351; CHECK-CPA-O0-LABEL: subi32:352; CHECK-CPA-O0: // %bb.0: // %entry353; CHECK-CPA-O0-NEXT: subs w0, w0, #1354; CHECK-CPA-O0-NEXT: ret355;356; CHECK-CPA-O3-LABEL: subi32:357; CHECK-CPA-O3: // %bb.0: // %entry358; CHECK-CPA-O3-NEXT: sub w0, w0, #1359; CHECK-CPA-O3-NEXT: ret360;361; CHECK-NOCPA-O0-LABEL: subi32:362; CHECK-NOCPA-O0: // %bb.0: // %entry363; CHECK-NOCPA-O0-NEXT: subs w0, w0, #1364; CHECK-NOCPA-O0-NEXT: ret365;366; CHECK-NOCPA-O3-LABEL: subi32:367; CHECK-NOCPA-O3: // %bb.0: // %entry368; CHECK-NOCPA-O3-NEXT: sub w0, w0, #1369; CHECK-NOCPA-O3-NEXT: ret370entry:371 %incdec.ptr.i.i.i = add i32 %ptr, -1372 ret i32 %incdec.ptr.i.i.i373}374 375define i16 @subi16(i16 %ptr, i32 %index) {376; CHECK-CPA-O0-LABEL: subi16:377; CHECK-CPA-O0: // %bb.0: // %entry378; CHECK-CPA-O0-NEXT: subs w0, w0, #1379; CHECK-CPA-O0-NEXT: ret380;381; CHECK-CPA-O3-LABEL: subi16:382; CHECK-CPA-O3: // %bb.0: // %entry383; CHECK-CPA-O3-NEXT: sub w0, w0, #1384; CHECK-CPA-O3-NEXT: ret385;386; CHECK-NOCPA-O0-LABEL: subi16:387; CHECK-NOCPA-O0: // %bb.0: // %entry388; CHECK-NOCPA-O0-NEXT: subs w0, w0, #1389; CHECK-NOCPA-O0-NEXT: ret390;391; CHECK-NOCPA-O3-LABEL: subi16:392; CHECK-NOCPA-O3: // %bb.0: // %entry393; CHECK-NOCPA-O3-NEXT: sub w0, w0, #1394; CHECK-NOCPA-O3-NEXT: ret395entry:396 %incdec.ptr.i.i.i = add i16 %ptr, -1397 ret i16 %incdec.ptr.i.i.i398}399 400define i64 @addi64(i64 %ptr, i32 %index) {401; CHECK-CPA-O0-LABEL: addi64:402; CHECK-CPA-O0: // %bb.0: // %entry403; CHECK-CPA-O0-NEXT: add x0, x0, #1404; CHECK-CPA-O0-NEXT: ret405;406; CHECK-CPA-O3-LABEL: addi64:407; CHECK-CPA-O3: // %bb.0: // %entry408; CHECK-CPA-O3-NEXT: add x0, x0, #1409; CHECK-CPA-O3-NEXT: ret410;411; CHECK-NOCPA-O0-LABEL: addi64:412; CHECK-NOCPA-O0: // %bb.0: // %entry413; CHECK-NOCPA-O0-NEXT: add x0, x0, #1414; CHECK-NOCPA-O0-NEXT: ret415;416; CHECK-NOCPA-O3-LABEL: addi64:417; CHECK-NOCPA-O3: // %bb.0: // %entry418; CHECK-NOCPA-O3-NEXT: add x0, x0, #1419; CHECK-NOCPA-O3-NEXT: ret420entry:421 %incdec.ptr.i.i.i = add i64 %ptr, 1422 ret i64 %incdec.ptr.i.i.i423}424 425define i32 @addi32(i32 %ptr, i32 %index) {426; CHECK-CPA-O0-LABEL: addi32:427; CHECK-CPA-O0: // %bb.0: // %entry428; CHECK-CPA-O0-NEXT: add w0, w0, #1429; CHECK-CPA-O0-NEXT: ret430;431; CHECK-CPA-O3-LABEL: addi32:432; CHECK-CPA-O3: // %bb.0: // %entry433; CHECK-CPA-O3-NEXT: add w0, w0, #1434; CHECK-CPA-O3-NEXT: ret435;436; CHECK-NOCPA-O0-LABEL: addi32:437; CHECK-NOCPA-O0: // %bb.0: // %entry438; CHECK-NOCPA-O0-NEXT: add w0, w0, #1439; CHECK-NOCPA-O0-NEXT: ret440;441; CHECK-NOCPA-O3-LABEL: addi32:442; CHECK-NOCPA-O3: // %bb.0: // %entry443; CHECK-NOCPA-O3-NEXT: add w0, w0, #1444; CHECK-NOCPA-O3-NEXT: ret445entry:446 %incdec.ptr.i.i.i = add i32 %ptr, 1447 ret i32 %incdec.ptr.i.i.i448}449 450define i16 @addi16(i16 %ptr, i32 %index) {451; CHECK-CPA-O0-LABEL: addi16:452; CHECK-CPA-O0: // %bb.0: // %entry453; CHECK-CPA-O0-NEXT: add w0, w0, #1454; CHECK-CPA-O0-NEXT: ret455;456; CHECK-CPA-O3-LABEL: addi16:457; CHECK-CPA-O3: // %bb.0: // %entry458; CHECK-CPA-O3-NEXT: add w0, w0, #1459; CHECK-CPA-O3-NEXT: ret460;461; CHECK-NOCPA-O0-LABEL: addi16:462; CHECK-NOCPA-O0: // %bb.0: // %entry463; CHECK-NOCPA-O0-NEXT: add w0, w0, #1464; CHECK-NOCPA-O0-NEXT: ret465;466; CHECK-NOCPA-O3-LABEL: addi16:467; CHECK-NOCPA-O3: // %bb.0: // %entry468; CHECK-NOCPA-O3-NEXT: add w0, w0, #1469; CHECK-NOCPA-O3-NEXT: ret470entry:471 %incdec.ptr.i.i.i = add i16 %ptr, 1472 ret i16 %incdec.ptr.i.i.i473}474 475define i64 @arith1(i64 noundef %0, i64 noundef %1, i64 noundef %2) {476; CHECK-CPA-O0-LABEL: arith1:477; CHECK-CPA-O0: // %bb.0: // %entry478; CHECK-CPA-O0-NEXT: sub sp, sp, #32479; CHECK-CPA-O0-NEXT: .cfi_def_cfa_offset 32480; CHECK-CPA-O0-NEXT: str x0, [sp, #24]481; CHECK-CPA-O0-NEXT: str x1, [sp, #16]482; CHECK-CPA-O0-NEXT: str x2, [sp, #8]483; CHECK-CPA-O0-NEXT: ldr x8, [sp, #24]484; CHECK-CPA-O0-NEXT: ldr x9, [sp, #16]485; CHECK-CPA-O0-NEXT: ldr x10, [sp, #8]486; CHECK-CPA-O0-NEXT: mul x9, x9, x10487; CHECK-CPA-O0-NEXT: add x0, x8, x9488; CHECK-CPA-O0-NEXT: add sp, sp, #32489; CHECK-CPA-O0-NEXT: ret490;491; CHECK-CPA-O3-LABEL: arith1:492; CHECK-CPA-O3: // %bb.0: // %entry493; CHECK-CPA-O3-NEXT: sub sp, sp, #32494; CHECK-CPA-O3-NEXT: .cfi_def_cfa_offset 32495; CHECK-CPA-O3-NEXT: stp x2, x1, [sp, #8]496; CHECK-CPA-O3-NEXT: str x0, [sp, #24]497; CHECK-CPA-O3-NEXT: madd x0, x1, x2, x0498; CHECK-CPA-O3-NEXT: add sp, sp, #32499; CHECK-CPA-O3-NEXT: ret500;501; CHECK-NOCPA-O0-LABEL: arith1:502; CHECK-NOCPA-O0: // %bb.0: // %entry503; CHECK-NOCPA-O0-NEXT: sub sp, sp, #32504; CHECK-NOCPA-O0-NEXT: .cfi_def_cfa_offset 32505; CHECK-NOCPA-O0-NEXT: str x0, [sp, #24]506; CHECK-NOCPA-O0-NEXT: str x1, [sp, #16]507; CHECK-NOCPA-O0-NEXT: str x2, [sp, #8]508; CHECK-NOCPA-O0-NEXT: ldr x8, [sp, #24]509; CHECK-NOCPA-O0-NEXT: ldr x9, [sp, #16]510; CHECK-NOCPA-O0-NEXT: ldr x10, [sp, #8]511; CHECK-NOCPA-O0-NEXT: mul x9, x9, x10512; CHECK-NOCPA-O0-NEXT: add x0, x8, x9513; CHECK-NOCPA-O0-NEXT: add sp, sp, #32514; CHECK-NOCPA-O0-NEXT: ret515;516; CHECK-NOCPA-O3-LABEL: arith1:517; CHECK-NOCPA-O3: // %bb.0: // %entry518; CHECK-NOCPA-O3-NEXT: sub sp, sp, #32519; CHECK-NOCPA-O3-NEXT: .cfi_def_cfa_offset 32520; CHECK-NOCPA-O3-NEXT: stp x2, x1, [sp, #8]521; CHECK-NOCPA-O3-NEXT: str x0, [sp, #24]522; CHECK-NOCPA-O3-NEXT: madd x0, x1, x2, x0523; CHECK-NOCPA-O3-NEXT: add sp, sp, #32524; CHECK-NOCPA-O3-NEXT: ret525entry:526 %4 = alloca i64, align 8527 %5 = alloca i64, align 8528 %6 = alloca i64, align 8529 store i64 %0, ptr %4, align 8530 store i64 %1, ptr %5, align 8531 store i64 %2, ptr %6, align 8532 %7 = load i64, ptr %4, align 8533 %8 = load i64, ptr %5, align 8534 %9 = load i64, ptr %6, align 8535 %10 = mul nsw i64 %8, %9536 %11 = add nsw i64 %7, %10537 ret i64 %11538}539 540define i64 @arith2(ptr noundef %0, i64 noundef %1, i64 noundef %2, i32 noundef %3) {541; CHECK-CPA-O0-LABEL: arith2:542; CHECK-CPA-O0: // %bb.0: // %entry543; CHECK-CPA-O0-NEXT: sub sp, sp, #32544; CHECK-CPA-O0-NEXT: .cfi_def_cfa_offset 32545; CHECK-CPA-O0-NEXT: str x0, [sp, #24]546; CHECK-CPA-O0-NEXT: str x1, [sp, #16]547; CHECK-CPA-O0-NEXT: str x2, [sp, #8]548; CHECK-CPA-O0-NEXT: str w3, [sp, #4]549; CHECK-CPA-O0-NEXT: ldr x10, [sp, #24]550; CHECK-CPA-O0-NEXT: ldrsw x8, [sp, #4]551; CHECK-CPA-O0-NEXT: mov w9, #48 // =0x30552; CHECK-CPA-O0-NEXT: // kill: def $x9 killed $w9553; CHECK-CPA-O0-NEXT: maddpt x8, x8, x9, x10554; CHECK-CPA-O0-NEXT: ldr x8, [x8, #24]555; CHECK-CPA-O0-NEXT: ldr x10, [sp, #16]556; CHECK-CPA-O0-NEXT: ldr x9, [sp, #8]557; CHECK-CPA-O0-NEXT: mul x10, x10, x9558; CHECK-CPA-O0-NEXT: add x8, x8, x10559; CHECK-CPA-O0-NEXT: subs x0, x8, x9560; CHECK-CPA-O0-NEXT: add sp, sp, #32561; CHECK-CPA-O0-NEXT: ret562;563; CHECK-CPA-O3-LABEL: arith2:564; CHECK-CPA-O3: // %bb.0: // %entry565; CHECK-CPA-O3-NEXT: sub sp, sp, #32566; CHECK-CPA-O3-NEXT: .cfi_def_cfa_offset 32567; CHECK-CPA-O3-NEXT: str w3, [sp, #4]568; CHECK-CPA-O3-NEXT: mov w10, #48 // =0x30569; CHECK-CPA-O3-NEXT: ldrsw x9, [sp, #4]570; CHECK-CPA-O3-NEXT: stp x1, x0, [sp, #16]571; CHECK-CPA-O3-NEXT: maddpt x8, x9, x10, x0572; CHECK-CPA-O3-NEXT: str x2, [sp, #8]573; CHECK-CPA-O3-NEXT: ldr x8, [x8, #24]574; CHECK-CPA-O3-NEXT: madd x8, x1, x2, x8575; CHECK-CPA-O3-NEXT: sub x0, x8, x2576; CHECK-CPA-O3-NEXT: add sp, sp, #32577; CHECK-CPA-O3-NEXT: ret578;579; CHECK-NOCPA-O0-LABEL: arith2:580; CHECK-NOCPA-O0: // %bb.0: // %entry581; CHECK-NOCPA-O0-NEXT: sub sp, sp, #32582; CHECK-NOCPA-O0-NEXT: .cfi_def_cfa_offset 32583; CHECK-NOCPA-O0-NEXT: str x0, [sp, #24]584; CHECK-NOCPA-O0-NEXT: str x1, [sp, #16]585; CHECK-NOCPA-O0-NEXT: str x2, [sp, #8]586; CHECK-NOCPA-O0-NEXT: str w3, [sp, #4]587; CHECK-NOCPA-O0-NEXT: ldr x8, [sp, #24]588; CHECK-NOCPA-O0-NEXT: ldrsw x9, [sp, #4]589; CHECK-NOCPA-O0-NEXT: mov w10, #48 // =0x30590; CHECK-NOCPA-O0-NEXT: // kill: def $x10 killed $w10591; CHECK-NOCPA-O0-NEXT: mul x9, x9, x10592; CHECK-NOCPA-O0-NEXT: add x8, x8, x9593; CHECK-NOCPA-O0-NEXT: ldr x8, [x8, #24]594; CHECK-NOCPA-O0-NEXT: ldr x10, [sp, #16]595; CHECK-NOCPA-O0-NEXT: ldr x9, [sp, #8]596; CHECK-NOCPA-O0-NEXT: mul x10, x10, x9597; CHECK-NOCPA-O0-NEXT: add x8, x8, x10598; CHECK-NOCPA-O0-NEXT: subs x0, x8, x9599; CHECK-NOCPA-O0-NEXT: add sp, sp, #32600; CHECK-NOCPA-O0-NEXT: ret601;602; CHECK-NOCPA-O3-LABEL: arith2:603; CHECK-NOCPA-O3: // %bb.0: // %entry604; CHECK-NOCPA-O3-NEXT: sub sp, sp, #32605; CHECK-NOCPA-O3-NEXT: .cfi_def_cfa_offset 32606; CHECK-NOCPA-O3-NEXT: str w3, [sp, #4]607; CHECK-NOCPA-O3-NEXT: mov w9, #48 // =0x30608; CHECK-NOCPA-O3-NEXT: ldrsw x8, [sp, #4]609; CHECK-NOCPA-O3-NEXT: stp x1, x0, [sp, #16]610; CHECK-NOCPA-O3-NEXT: str x2, [sp, #8]611; CHECK-NOCPA-O3-NEXT: madd x8, x8, x9, x0612; CHECK-NOCPA-O3-NEXT: ldr x8, [x8, #24]613; CHECK-NOCPA-O3-NEXT: madd x8, x1, x2, x8614; CHECK-NOCPA-O3-NEXT: sub x0, x8, x2615; CHECK-NOCPA-O3-NEXT: add sp, sp, #32616; CHECK-NOCPA-O3-NEXT: ret617entry:618 %5 = alloca ptr, align 8619 %6 = alloca i64, align 8620 %7 = alloca i64, align 8621 %8 = alloca i32, align 4622 store ptr %0, ptr %5, align 8623 store i64 %1, ptr %6, align 8624 store i64 %2, ptr %7, align 8625 store i32 %3, ptr %8, align 4626 %9 = load ptr, ptr %5, align 8627 %10 = load i32, ptr %8, align 4628 %11 = sext i32 %10 to i64629 %12 = getelementptr inbounds %struct.my_type2, ptr %9, i64 %11630 %13 = getelementptr inbounds %struct.my_type2, ptr %12, i32 0, i32 3631 %14 = load i64, ptr %13, align 8632 %15 = load i64, ptr %6, align 8633 %16 = load i64, ptr %7, align 8634 %17 = mul nsw i64 %15, %16635 %18 = add nsw i64 %14, %17636 %19 = sub nsw i64 %18, %16637 ret i64 %19638}639 640@a = hidden global [2 x [1 x [2 x i8]]] [[1 x [2 x i8]] [[2 x i8] c"\01\01"], [1 x [2 x i8]] [[2 x i8] c"\01\01"]], align 1641@b = hidden global i16 0, align 2642@.str = private unnamed_addr constant [7 x i8] c"hello\0A\00", align 1643 644define hidden void @multidim() {645; CHECK-CPA-O0-LABEL: multidim:646; CHECK-CPA-O0: // %bb.0: // %entry647; CHECK-CPA-O0-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill648; CHECK-CPA-O0-NEXT: .cfi_def_cfa_offset 16649; CHECK-CPA-O0-NEXT: .cfi_offset w30, -16650; CHECK-CPA-O0-NEXT: adrp x8, b651; CHECK-CPA-O0-NEXT: ldrh w9, [x8, :lo12:b]652; CHECK-CPA-O0-NEXT: mov w10, w9653; CHECK-CPA-O0-NEXT: ldrh w8, [x8, :lo12:b]654; CHECK-CPA-O0-NEXT: add w9, w8, #1655; CHECK-CPA-O0-NEXT: // implicit-def: $x8656; CHECK-CPA-O0-NEXT: mov w8, w9657; CHECK-CPA-O0-NEXT: sxtw x9, w8658; CHECK-CPA-O0-NEXT: mov w8, #2 // =0x2659; CHECK-CPA-O0-NEXT: mov w11, w8660; CHECK-CPA-O0-NEXT: adrp x8, a661; CHECK-CPA-O0-NEXT: add x8, x8, :lo12:a662; CHECK-CPA-O0-NEXT: addpt x8, x8, x11663; CHECK-CPA-O0-NEXT: addpt x8, x8, x10, lsl #1664; CHECK-CPA-O0-NEXT: addpt x8, x8, x9665; CHECK-CPA-O0-NEXT: ldrb w8, [x8]666; CHECK-CPA-O0-NEXT: cbz w8, .LBB14_2667; CHECK-CPA-O0-NEXT: b .LBB14_1668; CHECK-CPA-O0-NEXT: .LBB14_1:669; CHECK-CPA-O0-NEXT: adrp x0, .L.str670; CHECK-CPA-O0-NEXT: add x0, x0, :lo12:.L.str671; CHECK-CPA-O0-NEXT: bl printf672; CHECK-CPA-O0-NEXT: b .LBB14_2673; CHECK-CPA-O0-NEXT: .LBB14_2:674; CHECK-CPA-O0-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload675; CHECK-CPA-O0-NEXT: ret676;677; CHECK-CPA-O3-LABEL: multidim:678; CHECK-CPA-O3: // %bb.0: // %entry679; CHECK-CPA-O3-NEXT: adrp x8, b680; CHECK-CPA-O3-NEXT: adrp x10, a+2681; CHECK-CPA-O3-NEXT: add x10, x10, :lo12:a+2682; CHECK-CPA-O3-NEXT: ldrh w9, [x8, :lo12:b]683; CHECK-CPA-O3-NEXT: ldrh w8, [x8, :lo12:b]684; CHECK-CPA-O3-NEXT: addpt x9, x10, x9, lsl #1685; CHECK-CPA-O3-NEXT: addpt x8, x9, x8686; CHECK-CPA-O3-NEXT: ldrb w8, [x8, #1]687; CHECK-CPA-O3-NEXT: cbz w8, .LBB14_2688; CHECK-CPA-O3-NEXT: // %bb.1:689; CHECK-CPA-O3-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill690; CHECK-CPA-O3-NEXT: .cfi_def_cfa_offset 16691; CHECK-CPA-O3-NEXT: .cfi_offset w30, -16692; CHECK-CPA-O3-NEXT: adrp x0, .L.str693; CHECK-CPA-O3-NEXT: add x0, x0, :lo12:.L.str694; CHECK-CPA-O3-NEXT: bl printf695; CHECK-CPA-O3-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload696; CHECK-CPA-O3-NEXT: .LBB14_2:697; CHECK-CPA-O3-NEXT: ret698;699; CHECK-NOCPA-O0-LABEL: multidim:700; CHECK-NOCPA-O0: // %bb.0: // %entry701; CHECK-NOCPA-O0-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill702; CHECK-NOCPA-O0-NEXT: .cfi_def_cfa_offset 16703; CHECK-NOCPA-O0-NEXT: .cfi_offset w30, -16704; CHECK-NOCPA-O0-NEXT: adrp x8, b705; CHECK-NOCPA-O0-NEXT: ldrh w9, [x8, :lo12:b]706; CHECK-NOCPA-O0-NEXT: mov w10, w9707; CHECK-NOCPA-O0-NEXT: ldrh w8, [x8, :lo12:b]708; CHECK-NOCPA-O0-NEXT: add w9, w8, #1709; CHECK-NOCPA-O0-NEXT: adrp x8, a710; CHECK-NOCPA-O0-NEXT: add x8, x8, :lo12:a711; CHECK-NOCPA-O0-NEXT: add x8, x8, #2712; CHECK-NOCPA-O0-NEXT: add x8, x8, x10, lsl #1713; CHECK-NOCPA-O0-NEXT: add x8, x8, w9, sxtw714; CHECK-NOCPA-O0-NEXT: ldrb w8, [x8]715; CHECK-NOCPA-O0-NEXT: cbz w8, .LBB14_2716; CHECK-NOCPA-O0-NEXT: b .LBB14_1717; CHECK-NOCPA-O0-NEXT: .LBB14_1:718; CHECK-NOCPA-O0-NEXT: adrp x0, .L.str719; CHECK-NOCPA-O0-NEXT: add x0, x0, :lo12:.L.str720; CHECK-NOCPA-O0-NEXT: bl printf721; CHECK-NOCPA-O0-NEXT: b .LBB14_2722; CHECK-NOCPA-O0-NEXT: .LBB14_2:723; CHECK-NOCPA-O0-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload724; CHECK-NOCPA-O0-NEXT: ret725;726; CHECK-NOCPA-O3-LABEL: multidim:727; CHECK-NOCPA-O3: // %bb.0: // %entry728; CHECK-NOCPA-O3-NEXT: adrp x8, b729; CHECK-NOCPA-O3-NEXT: adrp x10, a+2730; CHECK-NOCPA-O3-NEXT: add x10, x10, :lo12:a+2731; CHECK-NOCPA-O3-NEXT: ldrh w9, [x8, :lo12:b]732; CHECK-NOCPA-O3-NEXT: ldrh w8, [x8, :lo12:b]733; CHECK-NOCPA-O3-NEXT: add x9, x10, x9, lsl #1734; CHECK-NOCPA-O3-NEXT: add x8, x9, x8735; CHECK-NOCPA-O3-NEXT: ldrb w8, [x8, #1]736; CHECK-NOCPA-O3-NEXT: cbz w8, .LBB14_2737; CHECK-NOCPA-O3-NEXT: // %bb.1:738; CHECK-NOCPA-O3-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill739; CHECK-NOCPA-O3-NEXT: .cfi_def_cfa_offset 16740; CHECK-NOCPA-O3-NEXT: .cfi_offset w30, -16741; CHECK-NOCPA-O3-NEXT: adrp x0, .L.str742; CHECK-NOCPA-O3-NEXT: add x0, x0, :lo12:.L.str743; CHECK-NOCPA-O3-NEXT: bl printf744; CHECK-NOCPA-O3-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload745; CHECK-NOCPA-O3-NEXT: .LBB14_2:746; CHECK-NOCPA-O3-NEXT: ret747entry:748 %1 = load i16, ptr @b, align 2749 %2 = zext i16 %1 to i64750 %3 = getelementptr inbounds nuw [1 x [2 x i8]], ptr getelementptr inbounds ([2 x [1 x [2 x i8]]], ptr @a, i64 0, i64 1), i64 0, i64 %2751 %4 = load i16, ptr @b, align 2752 %5 = zext i16 %4 to i32753 %6 = add nsw i32 %5, 1754 %7 = sext i32 %6 to i64755 %8 = getelementptr inbounds [2 x i8], ptr %3, i64 0, i64 %7756 %9 = load i8, ptr %8, align 1757 %10 = icmp ne i8 %9, 0758 br i1 %10, label %11, label %13759 76011:761 %12 = call i32 (ptr, ...) @printf(ptr noundef @.str)762 br label %13763 76413:765 ret void766}767 768declare void @llvm.memcpy.p0.p0.i64(ptr, ptr, i64, i1)769declare i32 @printf(ptr noundef, ...) #1770 771!6 = !{i64 0, i64 8, !7, i64 8, i64 8, !7, i64 16, i64 8, !7, i64 24, i64 8, !7, i64 32, i64 8, !7, i64 40, i64 8, !7}772!7 = !{!8, !8, i64 0}773!8 = !{!"long", !9, i64 0}774!9 = !{!"omnipotent char", !10, i64 0}775!10 = !{!"Simple C++ TBAA"}776!11 = !{i64 0, i64 8, !7, i64 8, i64 8, !7}777