88 lines · plain
1; RUN: llc -mtriple=x86_64 -o - %s | FileCheck %s2 3define i1 @try_cmpxchg(ptr %addr, i32 %desired, i32 %new) {4; CHECK-LABEL: try_cmpxchg:5; CHECK: cmpxchgl6; CHECK-NOT: cmp7; CHECK: sete %al8; CHECK: retq9 %pair = cmpxchg ptr %addr, i32 %desired, i32 %new seq_cst seq_cst10 %success = extractvalue { i32, i1 } %pair, 111 ret i1 %success12}13 14define void @cmpxchg_flow(ptr %addr, i64 %desired, i64 %new) {15; CHECK-LABEL: cmpxchg_flow:16; CHECK: cmpxchgq17; CHECK-NOT: cmp18; CHECK-NOT: set19; CHECK: {{jne|jeq}}20 %pair = cmpxchg ptr %addr, i64 %desired, i64 %new seq_cst seq_cst21 %success = extractvalue { i64, i1 } %pair, 122 br i1 %success, label %true, label %false23 24true:25 call void @foo()26 ret void27 28false:29 call void @bar()30 ret void31}32 33define i64 @cmpxchg_sext(ptr %addr, i32 %desired, i32 %new) {34; CHECK-LABEL: cmpxchg_sext:35; CHECK-DAG: cmpxchgl36; CHECK-NOT: cmpl37; CHECK: sete %cl38; CHECK: retq39 %pair = cmpxchg ptr %addr, i32 %desired, i32 %new seq_cst seq_cst40 %success = extractvalue { i32, i1 } %pair, 141 %mask = sext i1 %success to i6442 ret i64 %mask43}44 45define i32 @cmpxchg_zext(ptr %addr, i32 %desired, i32 %new) {46; CHECK-LABEL: cmpxchg_zext:47; CHECK: xorl %e[[R:[a-z]]]x48; CHECK: cmpxchgl49; CHECK-NOT: cmp50; CHECK: sete %[[R]]l51 %pair = cmpxchg ptr %addr, i32 %desired, i32 %new seq_cst seq_cst52 %success = extractvalue { i32, i1 } %pair, 153 %mask = zext i1 %success to i3254 ret i32 %mask55}56 57 58define i32 @cmpxchg_use_eflags_and_val(ptr %addr, i32 %offset) {59; CHECK-LABEL: cmpxchg_use_eflags_and_val:60; CHECK: movl (%rdi), %e[[OLDVAL:[a-z0-9]+]]61 62; CHECK: [[LOOPBB:.?LBB[0-9]+_[0-9]+]]:63; CHECK: leal (%r[[OLDVAL]],%rsi), [[NEW:%[a-z0-9]+]]64; CHECK: cmpxchgl [[NEW]], (%rdi)65; CHECK-NOT: cmpl66; CHECK: jne [[LOOPBB]]67 68 ; Result already in %eax69; CHECK: retq70entry:71 %init = load atomic i32, ptr %addr seq_cst, align 472 br label %loop73 74loop:75 %old = phi i32 [%init, %entry], [%oldval, %loop]76 %new = add i32 %old, %offset77 %pair = cmpxchg ptr %addr, i32 %old, i32 %new seq_cst seq_cst78 %oldval = extractvalue { i32, i1 } %pair, 079 %success = extractvalue { i32, i1 } %pair, 180 br i1 %success, label %done, label %loop81 82done:83 ret i32 %oldval84}85 86declare void @foo()87declare void @bar()88