brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.2 KiB · ae70c9c Raw
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