diff options
Diffstat (limited to 'clang')
-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; +} |