Author: Jennifer Yu Date: 2020-07-07T10:20:14-07:00 New Revision: 6cf0dac1ca3fd56c51f6a60f0be01cc25a1a2c6a
URL: https://github.com/llvm/llvm-project/commit/6cf0dac1ca3fd56c51f6a60f0be01cc25a1a2c6a DIFF: https://github.com/llvm/llvm-project/commit/6cf0dac1ca3fd56c51f6a60f0be01cc25a1a2c6a.diff LOG: orrectly generate invert xor value for Binary Atomics of int size > 64 When using __sync_nand_and_fetch with __int128, a problem is found that the wrong value for the 'invert' value gets emitted to the xor in case where the int size is greater than 64 bits. This is because uses of llvm::ConstantInt::get which zero extends the greater than 64 bits, so instead -1 that we require, it end up getting 18446744073709551615 This patch replaces the call to llvm::ConstantInt::get with the call to llvm::Constant::getAllOnesValue which works for all integer types. Reviewers: jfp, erichkeane, rjmccall, hfinkel Differential Revision: https://reviews.llvm.org/D82832 Added: Modified: clang/lib/CodeGen/CGBuiltin.cpp clang/test/CodeGen/Atomics.c Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 91969267cdb9..1d81ede5dc31 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -219,8 +219,9 @@ static RValue EmitBinaryAtomicPost(CodeGenFunction &CGF, Kind, Args[0], Args[1], llvm::AtomicOrdering::SequentiallyConsistent); Result = CGF.Builder.CreateBinOp(Op, Result, Args[1]); if (Invert) - Result = CGF.Builder.CreateBinOp(llvm::Instruction::Xor, Result, - llvm::ConstantInt::get(IntType, -1)); + Result = + CGF.Builder.CreateBinOp(llvm::Instruction::Xor, Result, + llvm::ConstantInt::getAllOnesValue(IntType)); Result = EmitFromInt(CGF, Result, T, ValueType); return RValue::get(Result); } diff --git a/clang/test/CodeGen/Atomics.c b/clang/test/CodeGen/Atomics.c index d960ac6df2f9..ebc9c139775a 100644 --- a/clang/test/CodeGen/Atomics.c +++ b/clang/test/CodeGen/Atomics.c @@ -10,6 +10,8 @@ signed int si; unsigned int ui; signed long long sll; unsigned long long ull; +__int128 s128; +unsigned __int128 u128; void test_op_ignore (void) // CHECK-LABEL: define void @test_op_ignore { @@ -48,6 +50,8 @@ void test_op_ignore (void) // CHECK-LABEL: define void @test_op_ignore (void) __sync_fetch_and_xor (&ui, 1); // CHECK: atomicrmw xor i32 (void) __sync_fetch_and_xor (&sll, 1); // CHECK: atomicrmw xor i64 (void) __sync_fetch_and_xor (&ull, 1); // CHECK: atomicrmw xor i64 + (void) __sync_fetch_and_xor (&u128, 1); // CHECK: atomicrmw xor i128 + (void) __sync_fetch_and_xor (&s128, 1); // CHECK: atomicrmw xor i128 (void) __sync_fetch_and_nand (&sc, 1); // CHECK: atomicrmw nand i8 (void) __sync_fetch_and_nand (&uc, 1); // CHECK: atomicrmw nand i8 @@ -168,27 +172,43 @@ void test_op_and_fetch (void) sc = __sync_nand_and_fetch (&sc, uc); // CHECK: atomicrmw nand // CHECK: and // CHECK: xor + // CHECK: -1 uc = __sync_nand_and_fetch (&uc, uc); // CHECK: atomicrmw nand // CHECK: and // CHECK: xor + // CHECK: -1 ss = __sync_nand_and_fetch (&ss, uc); // CHECK: atomicrmw nand // CHECK: and // CHECK: xor + // CHECK: -1 us = __sync_nand_and_fetch (&us, uc); // CHECK: atomicrmw nand // CHECK: and // CHECK: xor + // CHECK: -1 si = __sync_nand_and_fetch (&si, uc); // CHECK: atomicrmw nand // CHECK: and // CHECK: xor + // CHECK: -1 ui = __sync_nand_and_fetch (&ui, uc); // CHECK: atomicrmw nand // CHECK: and // CHECK: xor + // CHECK: -1 sll = __sync_nand_and_fetch (&sll, uc); // CHECK: atomicrmw nand // CHECK: and // CHECK: xor + // CHECK: -1 ull = __sync_nand_and_fetch (&ull, uc); // CHECK: atomicrmw nand // CHECK: and // CHECK: xor + // CHECK: -1 + u128 = __sync_nand_and_fetch (&u128, uc); // CHECK: atomicrmw nand + // CHECK: and + // CHECK: xor + // CHECK: -1 + s128 = __sync_nand_and_fetch (&s128, uc); // CHECK: atomicrmw nand + // CHECK: and + // CHECK: xor + // CHECK: -1 sc = __sync_and_and_fetch (&sc, uc); // CHECK: atomicrmw and uc = __sync_and_and_fetch (&uc, uc); // CHECK: atomicrmw and _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits