diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-02-14 01:35:07 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-02-14 01:35:07 +0000 |
commit | 6866a3c6f4c6ac4c368f4292b6567e456646b07b (patch) | |
tree | 4faf9187ddbd56c54ca88e3bf3457423d2078208 | |
parent | 33cc10724d7d5ae3e6502fb8806cc02a1f821aef (diff) | |
download | bcm5719-llvm-6866a3c6f4c6ac4c368f4292b6567e456646b07b.tar.gz bcm5719-llvm-6866a3c6f4c6ac4c368f4292b6567e456646b07b.zip |
CodeGen: Correctly convert atomic bool from i8 to i1
Bools are a little tricky, they are i8 in memory and must be coerced
back to i1 before further operations can be performed on them.
This fixes PR22577.
llvm-svn: 229204
-rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 2 | ||||
-rw-r--r-- | clang/test/CodeGen/atomic_ops.c | 10 |
2 files changed, 11 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 568f949c342..d82fff85dd3 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -1140,7 +1140,7 @@ llvm::Value *CodeGenFunction::EmitLoadOfScalar(llvm::Value *Addr, bool Volatile, LValue lvalue = LValue::MakeAddr(Addr, Ty, CharUnits::fromQuantity(Alignment), getContext(), TBAAInfo); - return EmitAtomicLoad(lvalue, Loc).getScalarVal(); + return EmitFromMemory(EmitAtomicLoad(lvalue, Loc).getScalarVal(), Ty); } llvm::LoadInst *Load = Builder.CreateLoad(Addr); diff --git a/clang/test/CodeGen/atomic_ops.c b/clang/test/CodeGen/atomic_ops.c index 29009bef894..5f2a1966a2a 100644 --- a/clang/test/CodeGen/atomic_ops.c +++ b/clang/test/CodeGen/atomic_ops.c @@ -16,3 +16,13 @@ void foo(int x) // CHECK: {{(cmpxchg i16*|i1 @__atomic_compare_exchange\(i32 2, )}} } + +extern _Atomic _Bool b; + +_Bool bar() { +// CHECK-LABEL: @bar +// CHECK: %[[load:.*]] = load atomic i8* @b seq_cst, align 1 +// CHECK: %[[tobool:.*]] = trunc i8 %[[load]] to i1 +// CHECK: ret i1 %[[tobool]] + return b; +} |