From 2a96bea6a7efd9efaaa8d1d72f1eb8ca27cb81f8 Mon Sep 17 00:00:00 2001
From: ReinUsesLisp <reinuseslisp@airmail.cc>
Date: Sat, 25 Apr 2020 22:42:33 -0300
Subject: [PATCH] shader/arithmetic_integer: Change IAdd to UAdd to avoid
 signed overflow

Signed integer addition overflow might be undefined behavior. It's free
to change operations to UAdd and use unsigned integers to avoid
potential bugs.
---
 src/video_core/shader/decode/arithmetic_integer.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/video_core/shader/decode/arithmetic_integer.cpp b/src/video_core/shader/decode/arithmetic_integer.cpp
index 2a3311cb8e..addd7f5333 100644
--- a/src/video_core/shader/decode/arithmetic_integer.cpp
+++ b/src/video_core/shader/decode/arithmetic_integer.cpp
@@ -40,12 +40,12 @@ u32 ShaderIR::DecodeArithmeticInteger(NodeBlock& bb, u32 pc) {
         op_a = GetOperandAbsNegInteger(op_a, false, instr.alu_integer.negate_a, true);
         op_b = GetOperandAbsNegInteger(op_b, false, instr.alu_integer.negate_b, true);
 
-        Node value = Operation(OperationCode::IAdd, op_a, op_b);
+        Node value = Operation(OperationCode::UAdd, op_a, op_b);
 
         if (instr.iadd.x) {
             Node carry = GetInternalFlag(InternalFlag::Carry);
             Node x = Operation(OperationCode::Select, std::move(carry), Immediate(1), Immediate(0));
-            value = Operation(OperationCode::IAdd, std::move(value), std::move(x));
+            value = Operation(OperationCode::UAdd, std::move(value), std::move(x));
         }
 
         if (instr.generates_cc) {