124 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s3 4; PR370255;6;#include <stdatomic.h>7;#include <stdbool.h>8;9;void func2();10;11;void func(_Atomic(unsigned long) * obj, ptr obj2)12;{13; if (atomic_fetch_sub(obj, 1) == 1 && obj2)14; func2();15;}16 17define void @test_dec_select(ptr nocapture %0, ptr readnone %1) {18; CHECK-LABEL: test_dec_select:19; CHECK: # %bb.0:20; CHECK-NEXT: lock decq (%rdi)21; CHECK-NEXT: sete %al22; CHECK-NEXT: testq %rsi, %rsi23; CHECK-NEXT: setne %cl24; CHECK-NEXT: andb %al, %cl25; CHECK-NEXT: cmpb $1, %cl26; CHECK-NEXT: je func2 # TAILCALL27; CHECK-NEXT: # %bb.1:28; CHECK-NEXT: retq29 %3 = atomicrmw sub ptr %0, i64 1 seq_cst30 %4 = icmp eq i64 %3, 131 %5 = icmp ne ptr %1, null32 %6 = select i1 %4, i1 %5, i1 false33 br i1 %6, label %7, label %834 357: ; preds = %236 tail call void @func2()37 br label %838 398: ; preds = %7, %240 ret void41}42 43define void @test_dec_select_commute(ptr nocapture %0, ptr readnone %1) {44; CHECK-LABEL: test_dec_select_commute:45; CHECK: # %bb.0:46; CHECK-NEXT: lock decq (%rdi)47; CHECK-NEXT: sete %al48; CHECK-NEXT: testq %rsi, %rsi49; CHECK-NEXT: setne %cl50; CHECK-NEXT: andb %al, %cl51; CHECK-NEXT: cmpb $1, %cl52; CHECK-NEXT: je func2 # TAILCALL53; CHECK-NEXT: # %bb.1:54; CHECK-NEXT: retq55 %3 = atomicrmw sub ptr %0, i64 1 seq_cst56 %4 = icmp eq i64 %3, 157 %5 = icmp ne ptr %1, null58 %6 = select i1 %5, i1 %4, i1 false59 br i1 %6, label %7, label %860 617: ; preds = %262 tail call void @func2()63 br label %864 658: ; preds = %7, %266 ret void67}68 69define void @test_dec_and(ptr nocapture %0, ptr readnone %1) {70; CHECK-LABEL: test_dec_and:71; CHECK: # %bb.0:72; CHECK-NEXT: lock decq (%rdi)73; CHECK-NEXT: sete %al74; CHECK-NEXT: notb %al75; CHECK-NEXT: testq %rsi, %rsi76; CHECK-NEXT: sete %cl77; CHECK-NEXT: orb %al, %cl78; CHECK-NEXT: testb $1, %cl79; CHECK-NEXT: je func2 # TAILCALL80; CHECK-NEXT: # %bb.1:81; CHECK-NEXT: retq82 %3 = atomicrmw sub ptr %0, i64 1 seq_cst83 %4 = icmp eq i64 %3, 184 %5 = icmp ne ptr %1, null85 %6 = and i1 %5, %486 br i1 %6, label %7, label %887 887: ; preds = %289 tail call void @func2()90 br label %891 928: ; preds = %7, %293 ret void94}95 96define void @test_dec_and_commute(ptr nocapture %0, ptr readnone %1) {97; CHECK-LABEL: test_dec_and_commute:98; CHECK: # %bb.0:99; CHECK-NEXT: lock decq (%rdi)100; CHECK-NEXT: sete %al101; CHECK-NEXT: notb %al102; CHECK-NEXT: testq %rsi, %rsi103; CHECK-NEXT: sete %cl104; CHECK-NEXT: orb %al, %cl105; CHECK-NEXT: testb $1, %cl106; CHECK-NEXT: je func2 # TAILCALL107; CHECK-NEXT: # %bb.1:108; CHECK-NEXT: retq109 %3 = atomicrmw sub ptr %0, i64 1 seq_cst110 %4 = icmp eq i64 %3, 1111 %5 = icmp ne ptr %1, null112 %6 = and i1 %4, %5113 br i1 %6, label %7, label %8114 1157: ; preds = %2116 tail call void @func2()117 br label %8118 1198: ; preds = %7, %2120 ret void121}122 123declare dso_local void @func2()124