void f2(void **bar) {
  const void *p1 = (const void *)bar;
  const char *p2 = (const char *)bar;
  const void **p3 = (const void **)bar;
  const char **p4 = (const char **)bar;
  const void *const *p5 = (const void *const *)bar;
  const char *const *p6 = (const char *const *)bar;
  void *const *p7 = (void *const *)bar;
  char *const *p8 = (char *const *)bar;
  const void ***p9 = (const void ***)bar;
  const char ***p10 = (const char ***)bar;
  void *const **p11 = (void *const **)bar;
  char *const **p12 = (char *const **)bar;
  void **const *p13 = (void **const *)bar;
  char **const *p14 = (char **const *)bar;
  const void *const **p15 = (const void *const **)bar;
  const char *const **p16 = (const char *const **)bar;
  const void **const *p17 = (const void **const *)bar;
  const char **const *p18 = (const char **const *)bar;
  void *const *const *p19 = (void *const *const *)bar;
  char *const *const *p20 = (char *const *const *)bar;
  const void *const *const *p21 = (const void *const *const *)bar;
  const char *const *const *p22 = (const char *const *const *)bar;
}


x86 assembly (clang, -O0):
<f2>:
push   %rbp
mov    %rsp,%rbp
sub    $0x38,%rsp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x78(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x80(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x88(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x90(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x98(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0xa0(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0xa8(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0xb0(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0xb8(%rbp)
add    $0x38,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<f2>:
ret

LLVM IR (-O0):
define void @f2(i8** %0) {
%2 = alloca i8**
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i8**
%6 = alloca i8**
%7 = alloca i8**
%8 = alloca i8**
%9 = alloca i8**
%10 = alloca i8**
%11 = alloca i8***
%12 = alloca i8***
%13 = alloca i8***
%14 = alloca i8***
%15 = alloca i8***
%16 = alloca i8***
%17 = alloca i8***
%18 = alloca i8***
%19 = alloca i8***
%20 = alloca i8***
%21 = alloca i8***
%22 = alloca i8***
%23 = alloca i8***
%24 = alloca i8***
store i8** %0, i8*** %2
%25 = load i8**, i8*** %2
%26 = bitcast i8** %25 to i8*
store i8* %26, i8** %3
%27 = load i8**, i8*** %2
%28 = bitcast i8** %27 to i8*
store i8* %28, i8** %4
%29 = load i8**, i8*** %2
store i8** %29, i8*** %5
%30 = load i8**, i8*** %2
store i8** %30, i8*** %6
%31 = load i8**, i8*** %2
store i8** %31, i8*** %7
%32 = load i8**, i8*** %2
store i8** %32, i8*** %8
%33 = load i8**, i8*** %2
store i8** %33, i8*** %9
%34 = load i8**, i8*** %2
store i8** %34, i8*** %10
%35 = load i8**, i8*** %2
%36 = bitcast i8** %35 to i8***
store i8*** %36, i8**** %11
%37 = load i8**, i8*** %2
%38 = bitcast i8** %37 to i8***
store i8*** %38, i8**** %12
%39 = load i8**, i8*** %2
%40 = bitcast i8** %39 to i8***
store i8*** %40, i8**** %13
%41 = load i8**, i8*** %2
%42 = bitcast i8** %41 to i8***
store i8*** %42, i8**** %14
%43 = load i8**, i8*** %2
%44 = bitcast i8** %43 to i8***
store i8*** %44, i8**** %15
%45 = load i8**, i8*** %2
%46 = bitcast i8** %45 to i8***
store i8*** %46, i8**** %16
%47 = load i8**, i8*** %2
%48 = bitcast i8** %47 to i8***
store i8*** %48, i8**** %17
%49 = load i8**, i8*** %2
%50 = bitcast i8** %49 to i8***
store i8*** %50, i8**** %18
%51 = load i8**, i8*** %2
%52 = bitcast i8** %51 to i8***
store i8*** %52, i8**** %19
%53 = load i8**, i8*** %2
%54 = bitcast i8** %53 to i8***
store i8*** %54, i8**** %20
%55 = load i8**, i8*** %2
%56 = bitcast i8** %55 to i8***
store i8*** %56, i8**** %21
%57 = load i8**, i8*** %2
%58 = bitcast i8** %57 to i8***
store i8*** %58, i8**** %22
%59 = load i8**, i8*** %2
%60 = bitcast i8** %59 to i8***
store i8*** %60, i8**** %23
%61 = load i8**, i8*** %2
%62 = bitcast i8** %61 to i8***
store i8*** %62, i8**** %24
ret void
}

LLVM IR (-O2):
define void @f2(i8** nocapture %0) {
ret void
}