183 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=i386-unknown-linux-gnu -mattr=-slow-incdec < %s | FileCheck -check-prefix=CHECK -check-prefix=INCDEC %s3; RUN: llc -mtriple=i386-unknown-linux-gnu -mattr=+slow-incdec < %s | FileCheck -check-prefix=CHECK -check-prefix=ADD %s4 5define i32 @inc(i32 %x) {6; INCDEC-LABEL: inc:7; INCDEC: # %bb.0:8; INCDEC-NEXT: movl {{[0-9]+}}(%esp), %eax9; INCDEC-NEXT: incl %eax10; INCDEC-NEXT: retl11;12; ADD-LABEL: inc:13; ADD: # %bb.0:14; ADD-NEXT: movl {{[0-9]+}}(%esp), %eax15; ADD-NEXT: addl $1, %eax16; ADD-NEXT: retl17 %r = add i32 %x, 118 ret i32 %r19}20 21define i32 @dec(i32 %x) {22; INCDEC-LABEL: dec:23; INCDEC: # %bb.0:24; INCDEC-NEXT: movl {{[0-9]+}}(%esp), %eax25; INCDEC-NEXT: decl %eax26; INCDEC-NEXT: retl27;28; ADD-LABEL: dec:29; ADD: # %bb.0:30; ADD-NEXT: movl {{[0-9]+}}(%esp), %eax31; ADD-NEXT: addl $-1, %eax32; ADD-NEXT: retl33 %r = add i32 %x, -134 ret i32 %r35}36 37define i32 @inc_size(i32 %x) optsize {38; CHECK-LABEL: inc_size:39; CHECK: # %bb.0:40; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax41; CHECK-NEXT: incl %eax42; CHECK-NEXT: retl43 %r = add i32 %x, 144 ret i32 %r45}46 47define i32 @dec_size(i32 %x) optsize {48; CHECK-LABEL: dec_size:49; CHECK: # %bb.0:50; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax51; CHECK-NEXT: decl %eax52; CHECK-NEXT: retl53 %r = add i32 %x, -154 ret i32 %r55}56 57define i32 @inc_pgso(i32 %x) !prof !14 {58; CHECK-LABEL: inc_pgso:59; CHECK: # %bb.0:60; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax61; CHECK-NEXT: incl %eax62; CHECK-NEXT: retl63 %r = add i32 %x, 164 ret i32 %r65}66 67define i32 @dec_pgso(i32 %x) !prof !14 {68; CHECK-LABEL: dec_pgso:69; CHECK: # %bb.0:70; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax71; CHECK-NEXT: decl %eax72; CHECK-NEXT: retl73 %r = add i32 %x, -174 ret i32 %r75}76 77declare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32)78declare void @other(ptr ) nounwind;79 80define void @cond_ae_to_cond_ne(ptr %p) nounwind {81; INCDEC-LABEL: cond_ae_to_cond_ne:82; INCDEC: # %bb.0: # %entry83; INCDEC-NEXT: movl {{[0-9]+}}(%esp), %eax84; INCDEC-NEXT: incl (%eax)85; INCDEC-NEXT: je other@PLT # TAILCALL86; INCDEC-NEXT: # %bb.1: # %return87; INCDEC-NEXT: retl88;89; ADD-LABEL: cond_ae_to_cond_ne:90; ADD: # %bb.0: # %entry91; ADD-NEXT: movl {{[0-9]+}}(%esp), %eax92; ADD-NEXT: addl $1, (%eax)93; ADD-NEXT: je other@PLT # TAILCALL94; ADD-NEXT: # %bb.1: # %return95; ADD-NEXT: retl96entry:97 %t0 = load i32, ptr %p, align 898 %add_ov = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %t0, i32 1)99 %inc = extractvalue { i32, i1 } %add_ov, 0100 store i32 %inc, ptr %p, align 8101 %ov = extractvalue { i32, i1 } %add_ov, 1102 br i1 %ov, label %if.end4, label %return103 104if.end4:105 tail call void @other(ptr %p) nounwind106 br label %return107 108return:109 ret void110}111 112@a = common global i8 0, align 1113@d = common global i8 0, align 1114 115declare void @external_a()116declare void @external_b()117declare {i8, i1} @llvm.uadd.with.overflow.i8(i8, i8)118 119define void @test_tail_call(ptr %ptr) nounwind {120; INCDEC-LABEL: test_tail_call:121; INCDEC: # %bb.0: # %entry122; INCDEC-NEXT: movl {{[0-9]+}}(%esp), %eax123; INCDEC-NEXT: incl (%eax)124; INCDEC-NEXT: setne %al125; INCDEC-NEXT: incb a126; INCDEC-NEXT: sete d127; INCDEC-NEXT: testb %al, %al128; INCDEC-NEXT: jne external_b@PLT # TAILCALL129; INCDEC-NEXT: # %bb.1: # %then130; INCDEC-NEXT: jmp external_a@PLT # TAILCALL131;132; ADD-LABEL: test_tail_call:133; ADD: # %bb.0: # %entry134; ADD-NEXT: movl {{[0-9]+}}(%esp), %eax135; ADD-NEXT: addl $1, (%eax)136; ADD-NEXT: setne %al137; ADD-NEXT: addb $1, a138; ADD-NEXT: sete d139; ADD-NEXT: testb %al, %al140; ADD-NEXT: jne external_b@PLT # TAILCALL141; ADD-NEXT: # %bb.1: # %then142; ADD-NEXT: jmp external_a@PLT # TAILCALL143entry:144 %val = load i32, ptr %ptr145 %add_ov = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %val, i32 1)146 %inc = extractvalue { i32, i1 } %add_ov, 0147 store i32 %inc, ptr %ptr148 %cmp = extractvalue { i32, i1 } %add_ov, 1149 %aval = load volatile i8, ptr @a150 %add_ov2 = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 %aval, i8 1)151 %inc2 = extractvalue { i8, i1 } %add_ov2, 0152 store volatile i8 %inc2, ptr @a153 %cmp2 = extractvalue { i8, i1 } %add_ov2, 1154 %conv5 = zext i1 %cmp2 to i8155 store i8 %conv5, ptr @d156 br i1 %cmp, label %then, label %else157 158then:159 tail call void @external_a()160 ret void161 162else:163 tail call void @external_b()164 ret void165}166 167!llvm.module.flags = !{!0}168!0 = !{i32 1, !"ProfileSummary", !1}169!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}170!2 = !{!"ProfileFormat", !"InstrProf"}171!3 = !{!"TotalCount", i64 10000}172!4 = !{!"MaxCount", i64 10}173!5 = !{!"MaxInternalCount", i64 1}174!6 = !{!"MaxFunctionCount", i64 1000}175!7 = !{!"NumCounts", i64 3}176!8 = !{!"NumFunctions", i64 3}177!9 = !{!"DetailedSummary", !10}178!10 = !{!11, !12, !13}179!11 = !{i32 10000, i64 100, i32 1}180!12 = !{i32 999000, i64 100, i32 1}181!13 = !{i32 999999, i64 1, i32 2}182!14 = !{!"function_entry_count", i64 0}183