297 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=arm-eabi %s -o - | FileCheck %s --check-prefixes=CHECK-V43; RUN: llc -mtriple=armv6-eabi %s -o - | FileCheck %s --check-prefixes=CHECK-V6V7,CHECK-ARM-V6V7,CHECK-V64; RUN: llc -mtriple=armv7-eabi %s -o - | FileCheck %s --check-prefixes=CHECK-V6V7,CHECK-ARM-V6V7,CHECK-V75; RUN: llc -mtriple=thumb-eabi %s -o - | FileCheck %s --check-prefixes=CHECK-THUMB6; RUN: llc -mtriple=thumbv6-eabi %s -o - | FileCheck %s --check-prefixes=CHECK-THUMBV67; RUN: llc -mtriple=thumbv6t2-eabi %s -o - | FileCheck %s --check-prefixes=CHECK-V6V7,CHECK-THUMB-V6V7,CHECK-THUMBV6T28; RUN: llc -mtriple=thumbv7-eabi %s -o - | FileCheck %s --check-prefixes=CHECK-V6V7,CHECK-THUMB-V6V7,CHECK-THUMBV79; RUN: llc -mtriple=thumbv7m-eabi %s -o - | FileCheck %s --check-prefixes=CHECK-THUMBV7M10; RUN: llc -mtriple=thumbv7em-eabi %s -o - | FileCheck %s --check-prefixes=CHECK-V6V7,CHECK-THUMB-V6V7,CHECK-THUMBV7EM11 12; Next test would previously trigger an assertion responsible for verification of13; call site info state.14; RUN: llc -stop-after=if-converter -debug-entry-values -mtriple=thumbv6t2-eabi %s -o -| FileCheck %s -check-prefix=CHECK-CALLSITE15; CHECK-CALLSITE: name: test_used_flags16; CHECK-CALLSITE: callSites:17 18define i32 @Test0(i32 %a, i32 %b, i32 %c) nounwind readnone ssp {19; CHECK-V4-LABEL: Test0:20; CHECK-V4: @ %bb.0: @ %entry21; CHECK-V4-NEXT: smull r3, r12, r2, r122; CHECK-V4-NEXT: sub r0, r0, r1223; CHECK-V4-NEXT: mov pc, lr24;25; CHECK-ARM-V6V7-LABEL: Test0:26; CHECK-ARM-V6V7: @ %bb.0: @ %entry27; CHECK-ARM-V6V7-NEXT: smmul r1, r2, r128; CHECK-ARM-V6V7-NEXT: sub r0, r0, r129; CHECK-ARM-V6V7-NEXT: bx lr30;31; CHECK-THUMB-LABEL: Test0:32; CHECK-THUMB: @ %bb.0: @ %entry33; CHECK-THUMB-NEXT: .save {r4, r5, r7, lr}34; CHECK-THUMB-NEXT: push {r4, r5, r7, lr}35; CHECK-THUMB-NEXT: movs r5, r136; CHECK-THUMB-NEXT: movs r4, r037; CHECK-THUMB-NEXT: asrs r1, r2, #3138; CHECK-THUMB-NEXT: asrs r3, r5, #3139; CHECK-THUMB-NEXT: movs r0, r240; CHECK-THUMB-NEXT: movs r2, r541; CHECK-THUMB-NEXT: bl __aeabi_lmul42; CHECK-THUMB-NEXT: subs r0, r4, r143; CHECK-THUMB-NEXT: pop {r4, r5, r7}44; CHECK-THUMB-NEXT: pop {r1}45; CHECK-THUMB-NEXT: bx r146;47; CHECK-THUMBV6-LABEL: Test0:48; CHECK-THUMBV6: @ %bb.0: @ %entry49; CHECK-THUMBV6-NEXT: .save {r4, r5, r7, lr}50; CHECK-THUMBV6-NEXT: push {r4, r5, r7, lr}51; CHECK-THUMBV6-NEXT: mov r5, r152; CHECK-THUMBV6-NEXT: mov r4, r053; CHECK-THUMBV6-NEXT: asrs r1, r2, #3154; CHECK-THUMBV6-NEXT: asrs r3, r5, #3155; CHECK-THUMBV6-NEXT: mov r0, r256; CHECK-THUMBV6-NEXT: mov r2, r557; CHECK-THUMBV6-NEXT: bl __aeabi_lmul58; CHECK-THUMBV6-NEXT: subs r0, r4, r159; CHECK-THUMBV6-NEXT: pop {r4, r5, r7, pc}60;61; CHECK-THUMB-V6V7-LABEL: Test0:62; CHECK-THUMB-V6V7: @ %bb.0: @ %entry63; CHECK-THUMB-V6V7-NEXT: smmul r1, r2, r164; CHECK-THUMB-V6V7-NEXT: subs r0, r0, r165; CHECK-THUMB-V6V7-NEXT: bx lr66;67; CHECK-THUMBV7M-LABEL: Test0:68; CHECK-THUMBV7M: @ %bb.0: @ %entry69; CHECK-THUMBV7M-NEXT: smull r1, r2, r2, r170; CHECK-THUMBV7M-NEXT: subs r0, r0, r271; CHECK-THUMBV7M-NEXT: bx lr72entry:73 %conv4 = zext i32 %a to i6474 %conv1 = sext i32 %b to i6475 %conv2 = sext i32 %c to i6476 %mul = mul nsw i64 %conv2, %conv177 %shr5 = lshr i64 %mul, 3278 %sub = sub nsw i64 %conv4, %shr579 %conv3 = trunc i64 %sub to i3280 ret i32 %conv381}82 83define i32 @Test1(i32 %a, i32 %b, i32 %c) {84; CHECK-V4-LABEL: Test1:85; CHECK-V4: @ %bb.0: @ %entry86; CHECK-V4-NEXT: smull r3, r12, r2, r187; CHECK-V4-NEXT: rsbs r1, r3, #088; CHECK-V4-NEXT: sbc r0, r0, r1289; CHECK-V4-NEXT: mov pc, lr90;91; CHECK-V6V7-LABEL: Test1:92; CHECK-V6V7: @ %bb.0: @ %entry93; CHECK-V6V7-NEXT: smmls r0, r2, r1, r094; CHECK-V6V7-NEXT: bx lr95;96; CHECK-THUMB-LABEL: Test1:97; CHECK-THUMB: @ %bb.0: @ %entry98; CHECK-THUMB-NEXT: .save {r4, r5, r7, lr}99; CHECK-THUMB-NEXT: push {r4, r5, r7, lr}100; CHECK-THUMB-NEXT: movs r5, r1101; CHECK-THUMB-NEXT: movs r4, r0102; CHECK-THUMB-NEXT: asrs r1, r2, #31103; CHECK-THUMB-NEXT: asrs r3, r5, #31104; CHECK-THUMB-NEXT: movs r0, r2105; CHECK-THUMB-NEXT: movs r2, r5106; CHECK-THUMB-NEXT: bl __aeabi_lmul107; CHECK-THUMB-NEXT: rsbs r0, r0, #0108; CHECK-THUMB-NEXT: sbcs r4, r1109; CHECK-THUMB-NEXT: movs r0, r4110; CHECK-THUMB-NEXT: pop {r4, r5, r7}111; CHECK-THUMB-NEXT: pop {r1}112; CHECK-THUMB-NEXT: bx r1113;114; CHECK-THUMBV6-LABEL: Test1:115; CHECK-THUMBV6: @ %bb.0: @ %entry116; CHECK-THUMBV6-NEXT: .save {r4, r5, r7, lr}117; CHECK-THUMBV6-NEXT: push {r4, r5, r7, lr}118; CHECK-THUMBV6-NEXT: mov r5, r1119; CHECK-THUMBV6-NEXT: mov r4, r0120; CHECK-THUMBV6-NEXT: asrs r1, r2, #31121; CHECK-THUMBV6-NEXT: asrs r3, r5, #31122; CHECK-THUMBV6-NEXT: mov r0, r2123; CHECK-THUMBV6-NEXT: mov r2, r5124; CHECK-THUMBV6-NEXT: bl __aeabi_lmul125; CHECK-THUMBV6-NEXT: rsbs r0, r0, #0126; CHECK-THUMBV6-NEXT: sbcs r4, r1127; CHECK-THUMBV6-NEXT: mov r0, r4128; CHECK-THUMBV6-NEXT: pop {r4, r5, r7, pc}129;130; CHECK-THUMBV7M-LABEL: Test1:131; CHECK-THUMBV7M: @ %bb.0: @ %entry132; CHECK-THUMBV7M-NEXT: smull r1, r2, r2, r1133; CHECK-THUMBV7M-NEXT: rsbs r1, r1, #0134; CHECK-THUMBV7M-NEXT: sbcs r0, r2135; CHECK-THUMBV7M-NEXT: bx lr136entry:137 %conv = sext i32 %b to i64138 %conv1 = sext i32 %c to i64139 %mul = mul nsw i64 %conv1, %conv140 %conv26 = zext i32 %a to i64141 %shl = shl nuw i64 %conv26, 32142 %sub = sub nsw i64 %shl, %mul143 %shr7 = lshr i64 %sub, 32144 %conv3 = trunc i64 %shr7 to i32145 ret i32 %conv3146}147 148declare void @opaque(i32)149define void @test_used_flags(i32 %in1, i32 %in2) {150; CHECK-V4-LABEL: test_used_flags:151; CHECK-V4: @ %bb.0:152; CHECK-V4-NEXT: .save {r11, lr}153; CHECK-V4-NEXT: push {r11, lr}154; CHECK-V4-NEXT: smull r2, r3, r0, r1155; CHECK-V4-NEXT: rsbs r0, r2, #0156; CHECK-V4-NEXT: rscs r0, r3, #0157; CHECK-V4-NEXT: movge r0, #42158; CHECK-V4-NEXT: movlt r0, #56159; CHECK-V4-NEXT: bl opaque160; CHECK-V4-NEXT: pop {r11, lr}161; CHECK-V4-NEXT: mov pc, lr162;163; CHECK-V6-LABEL: test_used_flags:164; CHECK-V6: @ %bb.0: @ %common.ret165; CHECK-V6-NEXT: .save {r11, lr}166; CHECK-V6-NEXT: push {r11, lr}167; CHECK-V6-NEXT: smull r1, r2, r0, r1168; CHECK-V6-NEXT: mov r0, #56169; CHECK-V6-NEXT: subs r1, r1, #1170; CHECK-V6-NEXT: sbcs r1, r2, #0171; CHECK-V6-NEXT: movlt r0, #42172; CHECK-V6-NEXT: bl opaque173; CHECK-V6-NEXT: pop {r11, pc}174;175; CHECK-V7-LABEL: test_used_flags:176; CHECK-V7: @ %bb.0: @ %common.ret177; CHECK-V7-NEXT: .save {r11, lr}178; CHECK-V7-NEXT: push {r11, lr}179; CHECK-V7-NEXT: smull r1, r2, r0, r1180; CHECK-V7-NEXT: mov r0, #56181; CHECK-V7-NEXT: subs r1, r1, #1182; CHECK-V7-NEXT: sbcs r1, r2, #0183; CHECK-V7-NEXT: movwlt r0, #42184; CHECK-V7-NEXT: bl opaque185; CHECK-V7-NEXT: pop {r11, pc}186;187; CHECK-THUMB-LABEL: test_used_flags:188; CHECK-THUMB: @ %bb.0:189; CHECK-THUMB-NEXT: .save {r7, lr}190; CHECK-THUMB-NEXT: push {r7, lr}191; CHECK-THUMB-NEXT: movs r2, r1192; CHECK-THUMB-NEXT: asrs r1, r0, #31193; CHECK-THUMB-NEXT: asrs r3, r2, #31194; CHECK-THUMB-NEXT: bl __aeabi_lmul195; CHECK-THUMB-NEXT: movs r2, #0196; CHECK-THUMB-NEXT: rsbs r0, r0, #0197; CHECK-THUMB-NEXT: sbcs r2, r1198; CHECK-THUMB-NEXT: bge .LBB2_2199; CHECK-THUMB-NEXT: @ %bb.1: @ %false200; CHECK-THUMB-NEXT: movs r0, #56201; CHECK-THUMB-NEXT: b .LBB2_3202; CHECK-THUMB-NEXT: .LBB2_2: @ %true203; CHECK-THUMB-NEXT: movs r0, #42204; CHECK-THUMB-NEXT: .LBB2_3: @ %true205; CHECK-THUMB-NEXT: bl opaque206; CHECK-THUMB-NEXT: pop {r7}207; CHECK-THUMB-NEXT: pop {r0}208; CHECK-THUMB-NEXT: bx r0209;210; CHECK-THUMBV6-LABEL: test_used_flags:211; CHECK-THUMBV6: @ %bb.0:212; CHECK-THUMBV6-NEXT: .save {r7, lr}213; CHECK-THUMBV6-NEXT: push {r7, lr}214; CHECK-THUMBV6-NEXT: mov r2, r1215; CHECK-THUMBV6-NEXT: asrs r1, r0, #31216; CHECK-THUMBV6-NEXT: asrs r3, r2, #31217; CHECK-THUMBV6-NEXT: bl __aeabi_lmul218; CHECK-THUMBV6-NEXT: movs r2, #0219; CHECK-THUMBV6-NEXT: rsbs r0, r0, #0220; CHECK-THUMBV6-NEXT: sbcs r2, r1221; CHECK-THUMBV6-NEXT: bge .LBB2_2222; CHECK-THUMBV6-NEXT: @ %bb.1: @ %false223; CHECK-THUMBV6-NEXT: movs r0, #56224; CHECK-THUMBV6-NEXT: bl opaque225; CHECK-THUMBV6-NEXT: pop {r7, pc}226; CHECK-THUMBV6-NEXT: .LBB2_2: @ %true227; CHECK-THUMBV6-NEXT: movs r0, #42228; CHECK-THUMBV6-NEXT: bl opaque229; CHECK-THUMBV6-NEXT: pop {r7, pc}230;231; CHECK-THUMBV6T2-LABEL: test_used_flags:232; CHECK-THUMBV6T2: @ %bb.0:233; CHECK-THUMBV6T2-NEXT: .save {r7, lr}234; CHECK-THUMBV6T2-NEXT: push {r7, lr}235; CHECK-THUMBV6T2-NEXT: smull r0, r1, r0, r1236; CHECK-THUMBV6T2-NEXT: movs r2, #0237; CHECK-THUMBV6T2-NEXT: rsbs r0, r0, #0238; CHECK-THUMBV6T2-NEXT: sbcs.w r0, r2, r1239; CHECK-THUMBV6T2-NEXT: ite lt240; CHECK-THUMBV6T2-NEXT: movlt r0, #56241; CHECK-THUMBV6T2-NEXT: movge r0, #42242; CHECK-THUMBV6T2-NEXT: bl opaque243; CHECK-THUMBV6T2-NEXT: pop {r7, pc}244;245; CHECK-THUMBV7-LABEL: test_used_flags:246; CHECK-THUMBV7: @ %bb.0: @ %common.ret247; CHECK-THUMBV7-NEXT: .save {r7, lr}248; CHECK-THUMBV7-NEXT: push {r7, lr}249; CHECK-THUMBV7-NEXT: smull r1, r2, r0, r1250; CHECK-THUMBV7-NEXT: movs r0, #56251; CHECK-THUMBV7-NEXT: subs r1, #1252; CHECK-THUMBV7-NEXT: sbcs r1, r2, #0253; CHECK-THUMBV7-NEXT: it lt254; CHECK-THUMBV7-NEXT: movlt r0, #42255; CHECK-THUMBV7-NEXT: bl opaque256; CHECK-THUMBV7-NEXT: pop {r7, pc}257;258; CHECK-THUMBV7M-LABEL: test_used_flags:259; CHECK-THUMBV7M: @ %bb.0: @ %common.ret260; CHECK-THUMBV7M-NEXT: .save {r7, lr}261; CHECK-THUMBV7M-NEXT: push {r7, lr}262; CHECK-THUMBV7M-NEXT: smull r1, r2, r0, r1263; CHECK-THUMBV7M-NEXT: movs r0, #56264; CHECK-THUMBV7M-NEXT: subs r1, #1265; CHECK-THUMBV7M-NEXT: sbcs r1, r2, #0266; CHECK-THUMBV7M-NEXT: it lt267; CHECK-THUMBV7M-NEXT: movlt r0, #42268; CHECK-THUMBV7M-NEXT: bl opaque269; CHECK-THUMBV7M-NEXT: pop {r7, pc}270;271; CHECK-THUMBV7EM-LABEL: test_used_flags:272; CHECK-THUMBV7EM: @ %bb.0: @ %common.ret273; CHECK-THUMBV7EM-NEXT: .save {r7, lr}274; CHECK-THUMBV7EM-NEXT: push {r7, lr}275; CHECK-THUMBV7EM-NEXT: smull r1, r2, r0, r1276; CHECK-THUMBV7EM-NEXT: movs r0, #56277; CHECK-THUMBV7EM-NEXT: subs r1, #1278; CHECK-THUMBV7EM-NEXT: sbcs r1, r2, #0279; CHECK-THUMBV7EM-NEXT: it lt280; CHECK-THUMBV7EM-NEXT: movlt r0, #42281; CHECK-THUMBV7EM-NEXT: bl opaque282; CHECK-THUMBV7EM-NEXT: pop {r7, pc}283 %in1.64 = sext i32 %in1 to i64284 %in2.64 = sext i32 %in2 to i64285 %mul = mul nsw i64 %in1.64, %in2.64286 %tst = icmp slt i64 %mul, 1287 br i1 %tst, label %true, label %false288 289true:290 call void @opaque(i32 42)291 ret void292 293false:294 call void @opaque(i32 56)295 ret void296}297