Here are instructions at this address:
80004b0: 482e ldr r0, [pc, #184] ; (800056c <main+0x1b4>)
80004b2: a90c add r1, sp, #48 ; 0x30
80004b4: e9cd 340c strd r3, r4, [sp, #48] ; 0x30
80004b8: 940e str r4, [sp, #56] ; 0x38 <-------------- affected part
80004ba: f000 fc77 bl 8000dac <HAL_GPIO_Init>
80004be: 2303 movs r3, #3
80004c0: 482c ldr r0, [pc, #176] ; (8000574 <main+0x1bc>)
80004c2: e9c8 0300 strd r0, r3, [r8]
0x940e is encoding T2 of the STR instruction. 0x950e would be "str r5, [sp, #56]". It is normal for some temporary registers to be reassigned, but I don't understand how you can have the rest of the program to be the same.
Edit: wait no, it makes sense. r4 and r5 hold values 0 and 2. This code is a part of a big chain of calls to HAL_GPIO_Init(), so one of them is different.
You should have a sequence of calls like this:
HAL_GPIO_Init();
............
HAL_GPIO_Init();
HAL_GPIO_Init();
HAL_GPIO_Init(); <----- this is the different GPIO
HAL_IWDG_Init();