Building the Linux kernel with Clang and LLVM
 help / color / mirror / Atom feed
* Re: [linux-next:master 3203/9634] arch/powerpc/include/asm/bitops.h:126:26: error: constraint 'n' expects an integer constant expression
       [not found] ` <Z81TSQHHaNq_Aj4x@gpd3>
@ 2025-03-09 18:48   ` Christophe Leroy
  2025-03-09 20:47     ` Andrea Righi
  0 siblings, 1 reply; 2+ messages in thread
From: Christophe Leroy @ 2025-03-09 18:48 UTC (permalink / raw)
  To: Andrea Righi, kernel test robot
  Cc: oe-kbuild-all, Tejun Heo, Yury Norov, clang-built-linux,
	llvm@lists.linux.dev



Le 09/03/2025 à 09:37, Andrea Righi a écrit :
> [Vous ne recevez pas souvent de courriers de arighi@nvidia.com. D?couvrez pourquoi ceci est important ? https://aka.ms/LearnAboutSenderIdentification ]
> 
> On Sun, Mar 09, 2025 at 04:56:45AM +0800, kernel test robot wrote:
>> tree:   https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgit.kernel.org%2Fpub%2Fscm%2Flinux%2Fkernel%2Fgit%2Fnext%2Flinux-next.git&data=05%7C02%7Cchristophe.leroy%40csgroup.eu%7C01ad01407fee4a03676d08dd5ee5a99d%7C8b87af7d86474dc78df45f69a2011bb5%7C0%7C0%7C638771062684017698%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=lK0Vy%2F4o95CtQF5szPezehhmcdFjDEGgf6JWYRIG%2FcY%3D&reserved=0 master
>> head:   0a2f889128969dab41861b6e40111aa03dc57014
>> commit: 48849271e66114cb980a3bc44218b04d0f8cdcdd [3203/9634] sched_ext: idle: Per-node idle cpumasks
>> config: powerpc-randconfig-r112-20250308 (https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdownload.01.org%2F0day-ci%2Farchive%2F20250309%2F202503090435.wITkzD2e-lkp%40intel.com%2Fconfig&data=05%7C02%7Cchristophe.leroy%40csgroup.eu%7C01ad01407fee4a03676d08dd5ee5a99d%7C8b87af7d86474dc78df45f69a2011bb5%7C0%7C0%7C638771062687408543%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=dNaCIS1An989v%2BhSzWt0F1M33pxzf0WO6G09wU3%2F90s%3D&reserved=0)
>> compiler: clang version 18.1.8 (https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fllvm%2Fllvm-project&data=05%7C02%7Cchristophe.leroy%40csgroup.eu%7C01ad01407fee4a03676d08dd5ee5a99d%7C8b87af7d86474dc78df45f69a2011bb5%7C0%7C0%7C638771062687416861%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=bBHENBhnCpqHz2ErtwY4iMTakfvmq5kumF0BVqN6hKQ%3D&reserved=0 3b5b5c1ec4a3095ab096dd780e84d7ab81f3d7ff)
>> reproduce: (https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdownload.01.org%2F0day-ci%2Farchive%2F20250309%2F202503090435.wITkzD2e-lkp%40intel.com%2Freproduce&data=05%7C02%7Cchristophe.leroy%40csgroup.eu%7C01ad01407fee4a03676d08dd5ee5a99d%7C8b87af7d86474dc78df45f69a2011bb5%7C0%7C0%7C638771062687424999%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=Wm6O%2BaoClsBaKLXtVLOi4uDpPVx6z%2FoXnE6LF%2BMnBH8%3D&reserved=0)
>>
>> If you fix the issue in a separate patch/commit (i.e. not just a new version of
>> the same patch/commit), kindly add following tags
>> | Reported-by: kernel test robot <lkp@intel.com>
>> | Closes: https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore.kernel.org%2Foe-kbuild-all%2F202503090435.wITkzD2e-lkp%40intel.com%2F&data=05%7C02%7Cchristophe.leroy%40csgroup.eu%7C01ad01407fee4a03676d08dd5ee5a99d%7C8b87af7d86474dc78df45f69a2011bb5%7C0%7C0%7C638771062687433012%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=vh%2BADDGxZZJblkU6V0NlC9VPlK2ZgQQWfTCdRMtfXNY%3D&reserved=0
>>
>> All errors (new ones prefixed by >>):
>>
>>     In file included from kernel/sched/build_policy.c:16:
>>     In file included from include/linux/sched/clock.h:5:
>>     In file included from include/linux/smp.h:13:
>>     In file included from include/linux/cpumask.h:11:
>>     In file included from include/linux/kernel.h:23:
>>     In file included from include/linux/bitops.h:68:
>>>> arch/powerpc/include/asm/bitops.h:126:26: error: constraint 'n' expects an integer constant expression
>>       126 | DEFINE_CLROP(clear_bits, "")
>>           |                          ^
>>     1 error generated.
> 
> I've expanded the for_each_node_numadist() macro to better understand
> what's going on, it seems that clang isn't happy with a node_clear() inside
> the for loop, and it's not complaining about a similar node_clear() outside
> the for loop.
> 
> Also, it seems to happen only with clang (gcc is always happy).
> 
> Here's the relevant code (with the macro expanded and comments removed):
> 
> ===
> static DEFINE_PER_CPU(nodemask_t, per_cpu_unvisited);
> 
> static s32 pick_idle_cpu_from_online_nodes(const struct cpumask *cpus_allowed, int node, u64 flags)
> {
>          nodemask_t *unvisited;
>          s32 cpu = -EBUSY;
> 
>          preempt_disable();
>          unvisited = this_cpu_ptr(&per_cpu_unvisited);
> 
>          nodes_copy(*unvisited, node_states[N_ONLINE]);
>          node_clear(node, *unvisited);
> 
>          for (int __start = node,
>               node = nearest_node_nodemask(__start, unvisited);
>               node < MAX_NUMNODES;
>               // node_clear(node, *unvisited), <- clang is happy with this one commented!
>               node = nearest_node_nodemask(__start, unvisited)) {
>                  cpu = pick_idle_cpu_in_node(cpus_allowed, node, flags);
>                  if (cpu >= 0)
>                          break;
>          }
>          preempt_enable();
> 
>          return cpu;
> }
> ===
> 
> The code looks correct to me, but I don't know much about powerpc assembly.
> Christophe, maybe you have a better idea of what's happening here?

#define DEFINE_CLROP(fn, prefix)					\
static inline void fn(unsigned long mask, volatile unsigned long *_p)	\
{									\
	unsigned long old;						\
	unsigned long *p = (unsigned long *)_p;				\
									\
	if (IS_ENABLED(CONFIG_PPC32) &&					\
	    __builtin_constant_p(mask) && is_rlwinm_mask_valid(~mask)) {\
		asm volatile (						\
			prefix						\
		"1:"	"lwarx	%0,0,%3\n"				\
			"rlwinm	%0,%0,0,%2\n"				\
			"stwcx.	%0,0,%3\n"				\
			"bne- 1b\n"					\
			: "=&r" (old), "+m" (*p)			\
			: "n" (~mask), "r" (p)				\
			: "cc", "memory");				\
	} else {							\
		asm volatile (						\
			prefix						\
		"1:"	PPC_LLARX "%0,0,%3,0\n"				\
			"andc %0,%0,%2\n"				\
			PPC_STLCX "%0,0,%3\n"				\
			"bne- 1b\n"					\
			: "=&r" (old), "+m" (*p)			\
			: "r" (mask), "r" (p)				\
			: "cc", "memory");				\
	}								\
}


clang says "constraint 'n' expects an integer constant expression" ?

The only place I see 'n' constraint in that macro is the '"n" (~mask)' 
in the if __builtin_constant_p(mask) branch. As far as I know if mask is 
a constant (~mask) is also a constant ?

Must be a clang bug ?

Maybe try with __builtin_constant_p(~mask) instead of 
__builtin_constant_p(mask)

Christophe

> 
> Thanks,
> -Andrea
> 
>>
>>
>> vim +/n +126 arch/powerpc/include/asm/bitops.h
>>
>> fb350784d8d179 Christophe Leroy 2021-09-21  125
>> fb350784d8d179 Christophe Leroy 2021-09-21 @126  DEFINE_CLROP(clear_bits, "")
>> fb350784d8d179 Christophe Leroy 2021-09-21  127  DEFINE_CLROP(clear_bits_unlock, PPC_RELEASE_BARRIER)
>> fb350784d8d179 Christophe Leroy 2021-09-21  128
>>
>> :::::: The code at line 126 was first introduced by commit
>> :::::: fb350784d8d17952afa93383bb47aaa6b715c459 powerpc/bitops: Use immediate operand when possible
>>
>> :::::: TO: Christophe Leroy <christophe.leroy@csgroup.eu>
>> :::::: CC: Michael Ellerman <mpe@ellerman.id.au>
>>
>> --
>> 0-DAY CI Kernel Test Service
>> https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fintel%2Flkp-tests%2Fwiki&data=05%7C02%7Cchristophe.leroy%40csgroup.eu%7C01ad01407fee4a03676d08dd5ee5a99d%7C8b87af7d86474dc78df45f69a2011bb5%7C0%7C0%7C638771062687441670%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=y4xmCm57X1U8WeYk2lPntirA60ajGxiW6u2xjp3t580%3D&reserved=0


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [linux-next:master 3203/9634] arch/powerpc/include/asm/bitops.h:126:26: error: constraint 'n' expects an integer constant expression
  2025-03-09 18:48   ` [linux-next:master 3203/9634] arch/powerpc/include/asm/bitops.h:126:26: error: constraint 'n' expects an integer constant expression Christophe Leroy
@ 2025-03-09 20:47     ` Andrea Righi
  0 siblings, 0 replies; 2+ messages in thread
From: Andrea Righi @ 2025-03-09 20:47 UTC (permalink / raw)
  To: Christophe Leroy
  Cc: kernel test robot, oe-kbuild-all, Tejun Heo, Yury Norov,
	clang-built-linux, llvm@lists.linux.dev

Hi Christophe,

On Sun, Mar 09, 2025 at 07:48:56PM +0100, Christophe Leroy wrote:
...
> #define DEFINE_CLROP(fn, prefix)					\
> static inline void fn(unsigned long mask, volatile unsigned long *_p)	\
> {									\
> 	unsigned long old;						\
> 	unsigned long *p = (unsigned long *)_p;				\
> 									\
> 	if (IS_ENABLED(CONFIG_PPC32) &&					\
> 	    __builtin_constant_p(mask) && is_rlwinm_mask_valid(~mask)) {\
> 		asm volatile (						\
> 			prefix						\
> 		"1:"	"lwarx	%0,0,%3\n"				\
> 			"rlwinm	%0,%0,0,%2\n"				\
> 			"stwcx.	%0,0,%3\n"				\
> 			"bne- 1b\n"					\
> 			: "=&r" (old), "+m" (*p)			\
> 			: "n" (~mask), "r" (p)				\
> 			: "cc", "memory");				\
> 	} else {							\
> 		asm volatile (						\
> 			prefix						\
> 		"1:"	PPC_LLARX "%0,0,%3,0\n"				\
> 			"andc %0,%0,%2\n"				\
> 			PPC_STLCX "%0,0,%3\n"				\
> 			"bne- 1b\n"					\
> 			: "=&r" (old), "+m" (*p)			\
> 			: "r" (mask), "r" (p)				\
> 			: "cc", "memory");				\
> 	}								\
> }
> 
> 
> clang says "constraint 'n' expects an integer constant expression" ?
> 
> The only place I see 'n' constraint in that macro is the '"n" (~mask)' in
> the if __builtin_constant_p(mask) branch. As far as I know if mask is a
> constant (~mask) is also a constant ?

Right, that's my understanding as well.

> 
> Must be a clang bug ?

Possibly...

> 
> Maybe try with __builtin_constant_p(~mask) instead of
> __builtin_constant_p(mask)

I tried using ~mask, and even tried to use just mask throughout the
entire macro (although the code would be incorrect), but I still get the
same build error.

The only way that I found to fix this is by adding
!IS_ENABLED(CONFIG_CC_IS_CLANG) to the if, which isn't really elegant, but
maybe it's a reasonable workaround? I'll also open a clang issue in the
meantime.

Thanks,
-Andrea

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2025-03-09 20:47 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <202503090435.wITkzD2e-lkp@intel.com>
     [not found] ` <Z81TSQHHaNq_Aj4x@gpd3>
2025-03-09 18:48   ` [linux-next:master 3203/9634] arch/powerpc/include/asm/bitops.h:126:26: error: constraint 'n' expects an integer constant expression Christophe Leroy
2025-03-09 20:47     ` Andrea Righi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox