aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/validation/linear
diff options
Diffstat (limited to 'validation/linear')
-rw-r--r--validation/linear/bitfield-inc.c16
-rw-r--r--validation/linear/bitfield-preinc.c18
-rw-r--r--validation/linear/bitfield-size.c142
-rw-r--r--validation/linear/bitfield-store.c22
-rw-r--r--validation/linear/call-complex-pointer.c10
-rw-r--r--validation/linear/cast-constant-to-float.c6
-rw-r--r--validation/linear/cast-constants.c20
-rw-r--r--validation/linear/cast-kinds.c405
-rw-r--r--validation/linear/logical.c259
9 files changed, 408 insertions, 490 deletions
diff --git a/validation/linear/bitfield-inc.c b/validation/linear/bitfield-inc.c
new file mode 100644
index 00000000..56997592
--- /dev/null
+++ b/validation/linear/bitfield-inc.c
@@ -0,0 +1,16 @@
+struct s {
+ int f:5;
+};
+
+void inc(struct s *p)
+{
+ p->f++;
+}
+
+/*
+ * check-name: bitfield-inc
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-ignore
+ * check-output-excludes: add\\.5
+ */
diff --git a/validation/linear/bitfield-preinc.c b/validation/linear/bitfield-preinc.c
new file mode 100644
index 00000000..783327ae
--- /dev/null
+++ b/validation/linear/bitfield-preinc.c
@@ -0,0 +1,18 @@
+struct s {
+ int f:3;
+};
+
+int preinc(void)
+{
+ struct s s = { 7 };
+ return ++s.f;
+}
+
+/*
+ * check-name: bitfield-preinc
+ * check-description: ++X is equivalent to X+=1
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-ignore
+ * check-output-contains: ret.32 *\\$0
+ */
diff --git a/validation/linear/bitfield-size.c b/validation/linear/bitfield-size.c
index 963f6e28..841bdd0a 100644
--- a/validation/linear/bitfield-size.c
+++ b/validation/linear/bitfield-size.c
@@ -49,41 +49,45 @@ upostinc:
load.64 %r1 <- 0[x]
load.32 %r2 <- 0[%r1]
trunc.3 %r3 <- (32) %r2
- add.3 %r4 <- %r3, $1
- load.32 %r5 <- 0[%r1]
- zext.32 %r6 <- (3) %r4
- and.32 %r7 <- %r5, $-8
- or.32 %r8 <- %r7, %r6
- store.32 %r8 -> 0[%r1]
- zext.32 %r9 <- (3) %r3
- phisrc.32 %phi1(return) <- %r9
+ zext.32 %r4 <- (3) %r3
+ add.32 %r5 <- %r4, $1
+ trunc.3 %r6 <- (32) %r5
+ load.32 %r7 <- 0[%r1]
+ zext.32 %r8 <- (3) %r6
+ and.32 %r9 <- %r7, $0xfffffff8
+ or.32 %r10 <- %r9, %r8
+ store.32 %r10 -> 0[%r1]
+ zext.32 %r11 <- (3) %r4
+ phisrc.32 %phi1(return) <- %r11
br .L1
.L1:
- phi.32 %r10 <- %phi1(return)
- ret.32 %r10
+ phi.32 %r12 <- %phi1(return)
+ ret.32 %r12
upreinc:
.L2:
<entry-point>
store.64 %arg1 -> 0[x]
- load.64 %r11 <- 0[x]
- load.32 %r12 <- 0[%r11]
- trunc.3 %r13 <- (32) %r12
- add.3 %r14 <- %r13, $1
- load.32 %r15 <- 0[%r11]
- zext.32 %r16 <- (3) %r14
- and.32 %r17 <- %r15, $-8
- or.32 %r18 <- %r17, %r16
- store.32 %r18 -> 0[%r11]
- zext.32 %r19 <- (3) %r14
- phisrc.32 %phi2(return) <- %r19
+ load.64 %r13 <- 0[x]
+ load.32 %r14 <- 0[%r13]
+ trunc.3 %r15 <- (32) %r14
+ zext.32 %r16 <- (3) %r15
+ add.32 %r17 <- %r16, $1
+ trunc.3 %r18 <- (32) %r17
+ load.32 %r19 <- 0[%r13]
+ zext.32 %r20 <- (3) %r18
+ and.32 %r21 <- %r19, $0xfffffff8
+ or.32 %r22 <- %r21, %r20
+ store.32 %r22 -> 0[%r13]
+ zext.32 %r23 <- (3) %r18
+ phisrc.32 %phi2(return) <- %r23
br .L3
.L3:
- phi.32 %r20 <- %phi2(return)
- ret.32 %r20
+ phi.32 %r24 <- %phi2(return)
+ ret.32 %r24
ucpy:
@@ -91,15 +95,15 @@ ucpy:
<entry-point>
store.64 %arg1 -> 0[d]
store.64 %arg2 -> 0[s]
- load.64 %r21 <- 0[s]
- load.32 %r22 <- 0[%r21]
- trunc.3 %r23 <- (32) %r22
- load.64 %r24 <- 0[d]
- load.32 %r25 <- 0[%r24]
- zext.32 %r26 <- (3) %r23
- and.32 %r27 <- %r25, $-8
- or.32 %r28 <- %r27, %r26
- store.32 %r28 -> 0[%r24]
+ load.64 %r25 <- 0[s]
+ load.32 %r26 <- 0[%r25]
+ trunc.3 %r27 <- (32) %r26
+ load.64 %r28 <- 0[d]
+ load.32 %r29 <- 0[%r28]
+ zext.32 %r30 <- (3) %r27
+ and.32 %r31 <- %r29, $0xfffffff8
+ or.32 %r32 <- %r31, %r30
+ store.32 %r32 -> 0[%r28]
br .L5
.L5:
@@ -110,44 +114,48 @@ spostinc:
.L6:
<entry-point>
store.64 %arg1 -> 0[x]
- load.64 %r29 <- 0[x]
- load.32 %r30 <- 0[%r29]
- trunc.3 %r31 <- (32) %r30
- add.3 %r32 <- %r31, $1
- load.32 %r33 <- 0[%r29]
- zext.32 %r34 <- (3) %r32
- and.32 %r35 <- %r33, $-8
- or.32 %r36 <- %r35, %r34
- store.32 %r36 -> 0[%r29]
- zext.32 %r37 <- (3) %r31
- phisrc.32 %phi3(return) <- %r37
+ load.64 %r33 <- 0[x]
+ load.32 %r34 <- 0[%r33]
+ trunc.3 %r35 <- (32) %r34
+ zext.32 %r36 <- (3) %r35
+ add.32 %r37 <- %r36, $1
+ trunc.3 %r38 <- (32) %r37
+ load.32 %r39 <- 0[%r33]
+ zext.32 %r40 <- (3) %r38
+ and.32 %r41 <- %r39, $0xfffffff8
+ or.32 %r42 <- %r41, %r40
+ store.32 %r42 -> 0[%r33]
+ zext.32 %r43 <- (3) %r36
+ phisrc.32 %phi3(return) <- %r43
br .L7
.L7:
- phi.32 %r38 <- %phi3(return)
- ret.32 %r38
+ phi.32 %r44 <- %phi3(return)
+ ret.32 %r44
spreinc:
.L8:
<entry-point>
store.64 %arg1 -> 0[x]
- load.64 %r39 <- 0[x]
- load.32 %r40 <- 0[%r39]
- trunc.3 %r41 <- (32) %r40
- add.3 %r42 <- %r41, $1
- load.32 %r43 <- 0[%r39]
- zext.32 %r44 <- (3) %r42
- and.32 %r45 <- %r43, $-8
- or.32 %r46 <- %r45, %r44
- store.32 %r46 -> 0[%r39]
- zext.32 %r47 <- (3) %r42
- phisrc.32 %phi4(return) <- %r47
+ load.64 %r45 <- 0[x]
+ load.32 %r46 <- 0[%r45]
+ trunc.3 %r47 <- (32) %r46
+ zext.32 %r48 <- (3) %r47
+ add.32 %r49 <- %r48, $1
+ trunc.3 %r50 <- (32) %r49
+ load.32 %r51 <- 0[%r45]
+ zext.32 %r52 <- (3) %r50
+ and.32 %r53 <- %r51, $0xfffffff8
+ or.32 %r54 <- %r53, %r52
+ store.32 %r54 -> 0[%r45]
+ zext.32 %r55 <- (3) %r50
+ phisrc.32 %phi4(return) <- %r55
br .L9
.L9:
- phi.32 %r48 <- %phi4(return)
- ret.32 %r48
+ phi.32 %r56 <- %phi4(return)
+ ret.32 %r56
scpy:
@@ -155,15 +163,15 @@ scpy:
<entry-point>
store.64 %arg1 -> 0[d]
store.64 %arg2 -> 0[s]
- load.64 %r49 <- 0[s]
- load.32 %r50 <- 0[%r49]
- trunc.3 %r51 <- (32) %r50
- load.64 %r52 <- 0[d]
- load.32 %r53 <- 0[%r52]
- zext.32 %r54 <- (3) %r51
- and.32 %r55 <- %r53, $-8
- or.32 %r56 <- %r55, %r54
- store.32 %r56 -> 0[%r52]
+ load.64 %r57 <- 0[s]
+ load.32 %r58 <- 0[%r57]
+ trunc.3 %r59 <- (32) %r58
+ load.64 %r60 <- 0[d]
+ load.32 %r61 <- 0[%r60]
+ zext.32 %r62 <- (3) %r59
+ and.32 %r63 <- %r61, $0xfffffff8
+ or.32 %r64 <- %r63, %r62
+ store.32 %r64 -> 0[%r60]
br .L11
.L11:
diff --git a/validation/linear/bitfield-store.c b/validation/linear/bitfield-store.c
new file mode 100644
index 00000000..3d952c8d
--- /dev/null
+++ b/validation/linear/bitfield-store.c
@@ -0,0 +1,22 @@
+int foo(void)
+{
+ struct {
+ int a:8;
+ int b:16;
+ int c:8;
+ } s = { 0xff, 0x0000, 0xff };
+
+ return s.b = 0x56781234;
+}
+
+/*
+ * check-name: bitfield-store
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-ignore
+ * check-output-contains: ret\\..*\\$0x1234
+ *
+ * check-error-start
+linear/bitfield-store.c:9:22: warning: cast truncates bits from constant value (56781234 becomes 1234)
+ * check-error-end
+ */
diff --git a/validation/linear/call-complex-pointer.c b/validation/linear/call-complex-pointer.c
index ea8232f1..dc0ab07b 100644
--- a/validation/linear/call-complex-pointer.c
+++ b/validation/linear/call-complex-pointer.c
@@ -18,14 +18,14 @@ foo:
br .L4
.L3:
- ptrcast.64 %r5 <- (64) %arg3
- phisrc.64 %phi2 <- %r5
+ ptrcast.64 %r6 <- (64) %arg3
+ phisrc.64 %phi2 <- %r6
br .L4
.L4:
- phi.64 %r6 <- %phi1, %phi2
- call.32 %r7 <- %r6, %arg4
- ret.32 %r7
+ phi.64 %r7 <- %phi1, %phi2
+ call.32 %r8 <- %r7, %arg4
+ ret.32 %r8
* check-output-end
diff --git a/validation/linear/cast-constant-to-float.c b/validation/linear/cast-constant-to-float.c
index ef7892f1..ac4eff0f 100644
--- a/validation/linear/cast-constant-to-float.c
+++ b/validation/linear/cast-constant-to-float.c
@@ -13,21 +13,21 @@ double f3(void) { return -1.0; }
f1:
.L0:
<entry-point>
- setfval.64 %r1 <- -1.000000
+ setfval.64 %r1 <- -1.000000e+00
ret.64 %r1
f2:
.L2:
<entry-point>
- setfval.64 %r3 <- -1.000000
+ setfval.64 %r3 <- -1.000000e+00
ret.64 %r3
f3:
.L4:
<entry-point>
- setfval.64 %r5 <- -1.000000
+ setfval.64 %r5 <- -1.000000e+00
ret.64 %r5
diff --git a/validation/linear/cast-constants.c b/validation/linear/cast-constants.c
index 9e200672..c1fdab41 100644
--- a/validation/linear/cast-constants.c
+++ b/validation/linear/cast-constants.c
@@ -286,70 +286,70 @@ vptr_2_iptr:
int_2_float:
.L76:
<entry-point>
- setfval.32 %r39 <- 123.000000
+ setfval.32 %r39 <- 1.230000e+02
ret.32 %r39
uint_2_float:
.L78:
<entry-point>
- setfval.32 %r41 <- 123.000000
+ setfval.32 %r41 <- 1.230000e+02
ret.32 %r41
long_2_float:
.L80:
<entry-point>
- setfval.32 %r43 <- 123.000000
+ setfval.32 %r43 <- 1.230000e+02
ret.32 %r43
ulong_2_float:
.L82:
<entry-point>
- setfval.32 %r45 <- 123.000000
+ setfval.32 %r45 <- 1.230000e+02
ret.32 %r45
double_2_float:
.L84:
<entry-point>
- setfval.32 %r47 <- 1.123000
+ setfval.32 %r47 <- 1.123000e+00
ret.32 %r47
int_2_double:
.L86:
<entry-point>
- setfval.64 %r49 <- 123.000000
+ setfval.64 %r49 <- 1.230000e+02
ret.64 %r49
uint_2_double:
.L88:
<entry-point>
- setfval.64 %r51 <- 123.000000
+ setfval.64 %r51 <- 1.230000e+02
ret.64 %r51
long_2_double:
.L90:
<entry-point>
- setfval.64 %r53 <- 123.000000
+ setfval.64 %r53 <- 1.230000e+02
ret.64 %r53
ulong_2_double:
.L92:
<entry-point>
- setfval.64 %r55 <- 123.000000
+ setfval.64 %r55 <- 1.230000e+02
ret.64 %r55
float_2_double:
.L94:
<entry-point>
- setfval.64 %r57 <- 1.123000
+ setfval.64 %r57 <- 1.123000e+00
ret.64 %r57
diff --git a/validation/linear/cast-kinds.c b/validation/linear/cast-kinds.c
deleted file mode 100644
index 5df307bc..00000000
--- a/validation/linear/cast-kinds.c
+++ /dev/null
@@ -1,405 +0,0 @@
-typedef unsigned int uint;
-typedef unsigned long ulong;
-
-static int uint_2_int(uint a) { return (int)a; }
-static int long_2_int(long a) { return (int)a; }
-static int ulong_2_int(ulong a) { return (int)a; }
-static int vptr_2_int(void *a) { return (int)a; }
-static int iptr_2_int(int *a) { return (int)a; }
-static int float_2_int(float a) { return (int)a; }
-static int double_2_int(double a) { return (int)a; }
-static uint int_2_uint(int a) { return (uint)a; }
-static uint long_2_uint(long a) { return (uint)a; }
-static uint ulong_2_uint(ulong a) { return (uint)a; }
-static uint vptr_2_uint(void *a) { return (uint)a; }
-static uint iptr_2_uint(int *a) { return (uint)a; }
-static uint float_2_uint(float a) { return (uint)a; }
-static uint double_2_uint(double a) { return (uint)a; }
-static long int_2_long(int a) { return (long)a; }
-static long uint_2_long(uint a) { return (long)a; }
-static long ulong_2_long(ulong a) { return (long)a; }
-static long vptr_2_long(void *a) { return (long)a; }
-static long iptr_2_long(int *a) { return (long)a; }
-static long float_2_long(float a) { return (long)a; }
-static long double_2_long(double a) { return (long)a; }
-static ulong int_2_ulong(int a) { return (ulong)a; }
-static ulong uint_2_ulong(uint a) { return (ulong)a; }
-static ulong long_2_ulong(long a) { return (ulong)a; }
-static ulong vptr_2_ulong(void *a) { return (ulong)a; }
-static ulong iptr_2_ulong(int *a) { return (ulong)a; }
-static ulong float_2_ulong(float a) { return (ulong)a; }
-static ulong double_2_ulong(double a) { return (ulong)a; }
-static void * int_2_vptr(int a) { return (void *)a; }
-static void * uint_2_vptr(uint a) { return (void *)a; }
-static void * long_2_vptr(long a) { return (void *)a; }
-static void * ulong_2_vptr(ulong a) { return (void *)a; }
-static void * iptr_2_vptr(int *a) { return (void *)a; }
-static int * int_2_iptr(int a) { return (int *)a; }
-static int * uint_2_iptr(uint a) { return (int *)a; }
-static int * long_2_iptr(long a) { return (int *)a; }
-static int * ulong_2_iptr(ulong a) { return (int *)a; }
-static int * vptr_2_iptr(void *a) { return (int *)a; }
-static float int_2_float(int a) { return (float)a; }
-static float uint_2_float(uint a) { return (float)a; }
-static float long_2_float(long a) { return (float)a; }
-static float ulong_2_float(ulong a) { return (float)a; }
-static float double_2_float(double a) { return (float)a; }
-static double int_2_double(int a) { return (double)a; }
-static double uint_2_double(uint a) { return (double)a; }
-static double long_2_double(long a) { return (double)a; }
-static double ulong_2_double(ulong a) { return (double)a; }
-static double float_2_double(float a) { return (double)a; }
-
-static float float_2_float(float a) { return a; }
-static double double_2_double(double a) { return a; }
-
-/*
- * check-name: cast-kinds
- * check-command: test-linearize -Wno-int-to-pointer-cast -Wno-pointer-to-int-cast -m64 $file
- *
- * check-output-start
-uint_2_int:
-.L0:
- <entry-point>
- ret.32 %arg1
-
-
-long_2_int:
-.L2:
- <entry-point>
- trunc.32 %r4 <- (64) %arg1
- ret.32 %r4
-
-
-ulong_2_int:
-.L4:
- <entry-point>
- trunc.32 %r7 <- (64) %arg1
- ret.32 %r7
-
-
-vptr_2_int:
-.L6:
- <entry-point>
- trunc.32 %r10 <- (64) %arg1
- ret.32 %r10
-
-
-iptr_2_int:
-.L8:
- <entry-point>
- ptrtu.64 %r13 <- (64) %arg1
- trunc.32 %r14 <- (64) %r13
- ret.32 %r14
-
-
-float_2_int:
-.L10:
- <entry-point>
- fcvts.32 %r17 <- (32) %arg1
- ret.32 %r17
-
-
-double_2_int:
-.L12:
- <entry-point>
- fcvts.32 %r20 <- (64) %arg1
- ret.32 %r20
-
-
-int_2_uint:
-.L14:
- <entry-point>
- ret.32 %arg1
-
-
-long_2_uint:
-.L16:
- <entry-point>
- trunc.32 %r25 <- (64) %arg1
- ret.32 %r25
-
-
-ulong_2_uint:
-.L18:
- <entry-point>
- trunc.32 %r28 <- (64) %arg1
- ret.32 %r28
-
-
-vptr_2_uint:
-.L20:
- <entry-point>
- trunc.32 %r31 <- (64) %arg1
- ret.32 %r31
-
-
-iptr_2_uint:
-.L22:
- <entry-point>
- ptrtu.64 %r34 <- (64) %arg1
- trunc.32 %r35 <- (64) %r34
- ret.32 %r35
-
-
-float_2_uint:
-.L24:
- <entry-point>
- fcvtu.32 %r38 <- (32) %arg1
- ret.32 %r38
-
-
-double_2_uint:
-.L26:
- <entry-point>
- fcvtu.32 %r41 <- (64) %arg1
- ret.32 %r41
-
-
-int_2_long:
-.L28:
- <entry-point>
- sext.64 %r44 <- (32) %arg1
- ret.64 %r44
-
-
-uint_2_long:
-.L30:
- <entry-point>
- zext.64 %r47 <- (32) %arg1
- ret.64 %r47
-
-
-ulong_2_long:
-.L32:
- <entry-point>
- ret.64 %arg1
-
-
-vptr_2_long:
-.L34:
- <entry-point>
- ret.64 %arg1
-
-
-iptr_2_long:
-.L36:
- <entry-point>
- ptrtu.64 %r54 <- (64) %arg1
- ret.64 %r54
-
-
-float_2_long:
-.L38:
- <entry-point>
- fcvts.64 %r57 <- (32) %arg1
- ret.64 %r57
-
-
-double_2_long:
-.L40:
- <entry-point>
- fcvts.64 %r60 <- (64) %arg1
- ret.64 %r60
-
-
-int_2_ulong:
-.L42:
- <entry-point>
- sext.64 %r63 <- (32) %arg1
- ret.64 %r63
-
-
-uint_2_ulong:
-.L44:
- <entry-point>
- zext.64 %r66 <- (32) %arg1
- ret.64 %r66
-
-
-long_2_ulong:
-.L46:
- <entry-point>
- ret.64 %arg1
-
-
-vptr_2_ulong:
-.L48:
- <entry-point>
- ret.64 %arg1
-
-
-iptr_2_ulong:
-.L50:
- <entry-point>
- ptrtu.64 %r73 <- (64) %arg1
- ret.64 %r73
-
-
-float_2_ulong:
-.L52:
- <entry-point>
- fcvtu.64 %r76 <- (32) %arg1
- ret.64 %r76
-
-
-double_2_ulong:
-.L54:
- <entry-point>
- fcvtu.64 %r79 <- (64) %arg1
- ret.64 %r79
-
-
-int_2_vptr:
-.L56:
- <entry-point>
- sext.64 %r82 <- (32) %arg1
- ret.64 %r82
-
-
-uint_2_vptr:
-.L58:
- <entry-point>
- zext.64 %r85 <- (32) %arg1
- ret.64 %r85
-
-
-long_2_vptr:
-.L60:
- <entry-point>
- ret.64 %arg1
-
-
-ulong_2_vptr:
-.L62:
- <entry-point>
- ret.64 %arg1
-
-
-iptr_2_vptr:
-.L64:
- <entry-point>
- ret.64 %arg1
-
-
-int_2_iptr:
-.L66:
- <entry-point>
- sext.64 %r94 <- (32) %arg1
- utptr.64 %r95 <- (64) %r94
- ret.64 %r95
-
-
-uint_2_iptr:
-.L68:
- <entry-point>
- zext.64 %r98 <- (32) %arg1
- utptr.64 %r99 <- (64) %r98
- ret.64 %r99
-
-
-long_2_iptr:
-.L70:
- <entry-point>
- utptr.64 %r102 <- (64) %arg1
- ret.64 %r102
-
-
-ulong_2_iptr:
-.L72:
- <entry-point>
- utptr.64 %r105 <- (64) %arg1
- ret.64 %r105
-
-
-vptr_2_iptr:
-.L74:
- <entry-point>
- ptrcast.64 %r108 <- (64) %arg1
- ret.64 %r108
-
-
-int_2_float:
-.L76:
- <entry-point>
- scvtf.32 %r111 <- (32) %arg1
- ret.32 %r111
-
-
-uint_2_float:
-.L78:
- <entry-point>
- ucvtf.32 %r114 <- (32) %arg1
- ret.32 %r114
-
-
-long_2_float:
-.L80:
- <entry-point>
- scvtf.32 %r117 <- (64) %arg1
- ret.32 %r117
-
-
-ulong_2_float:
-.L82:
- <entry-point>
- ucvtf.32 %r120 <- (64) %arg1
- ret.32 %r120
-
-
-double_2_float:
-.L84:
- <entry-point>
- fcvtf.32 %r123 <- (64) %arg1
- ret.32 %r123
-
-
-int_2_double:
-.L86:
- <entry-point>
- scvtf.64 %r126 <- (32) %arg1
- ret.64 %r126
-
-
-uint_2_double:
-.L88:
- <entry-point>
- ucvtf.64 %r129 <- (32) %arg1
- ret.64 %r129
-
-
-long_2_double:
-.L90:
- <entry-point>
- scvtf.64 %r132 <- (64) %arg1
- ret.64 %r132
-
-
-ulong_2_double:
-.L92:
- <entry-point>
- ucvtf.64 %r135 <- (64) %arg1
- ret.64 %r135
-
-
-float_2_double:
-.L94:
- <entry-point>
- fcvtf.64 %r138 <- (32) %arg1
- ret.64 %r138
-
-
-float_2_float:
-.L96:
- <entry-point>
- ret.32 %arg1
-
-
-double_2_double:
-.L98:
- <entry-point>
- ret.64 %arg1
-
-
- * check-output-end
- */
diff --git a/validation/linear/logical.c b/validation/linear/logical.c
new file mode 100644
index 00000000..0f502c6b
--- /dev/null
+++ b/validation/linear/logical.c
@@ -0,0 +1,259 @@
+struct S {
+ int :1;
+ signed int s:2;
+ unsigned int u:3;
+ long l;
+ double d;
+};
+
+int os(int i, struct S *b) { return i || b->s; }
+int ou(int i, struct S *b) { return i || b->u; }
+int ol(int i, struct S *b) { return i || b->l; }
+int od(int i, struct S *b) { return i || b->d; }
+
+int as(int i, struct S *b) { return i && b->s; }
+int au(int i, struct S *b) { return i && b->u; }
+int al(int i, struct S *b) { return i && b->l; }
+int ad(int i, struct S *b) { return i && b->d; }
+
+/*
+ * check-name: logical
+ * check-command: test-linearize -m64 -fdump-ir -Wno-decl $file
+ *
+ * check-output-start
+os:
+.L0:
+ <entry-point>
+ store.32 %arg1 -> 0[i]
+ store.64 %arg2 -> 0[b]
+ phisrc.32 %phi1 <- $1
+ load.32 %r1 <- 0[i]
+ setne.1 %r2 <- %r1, $0
+ cbr %r2, .L3, .L2
+
+.L2:
+ load.64 %r3 <- 0[b]
+ load.32 %r4 <- 0[%r3]
+ lsr.32 %r5 <- %r4, $1
+ trunc.2 %r6 <- (32) %r5
+ setne.1 %r7 <- %r6, $0
+ zext.32 %r8 <- (1) %r7
+ phisrc.32 %phi2 <- %r8
+ br .L3
+
+.L3:
+ phi.32 %r9 <- %phi1, %phi2
+ phisrc.32 %phi3(return) <- %r9
+ br .L1
+
+.L1:
+ phi.32 %r10 <- %phi3(return)
+ ret.32 %r10
+
+
+ou:
+.L4:
+ <entry-point>
+ store.32 %arg1 -> 0[i]
+ store.64 %arg2 -> 0[b]
+ phisrc.32 %phi4 <- $1
+ load.32 %r11 <- 0[i]
+ setne.1 %r12 <- %r11, $0
+ cbr %r12, .L7, .L6
+
+.L6:
+ load.64 %r13 <- 0[b]
+ load.32 %r14 <- 0[%r13]
+ lsr.32 %r15 <- %r14, $3
+ trunc.3 %r16 <- (32) %r15
+ setne.1 %r17 <- %r16, $0
+ zext.32 %r18 <- (1) %r17
+ phisrc.32 %phi5 <- %r18
+ br .L7
+
+.L7:
+ phi.32 %r19 <- %phi4, %phi5
+ phisrc.32 %phi6(return) <- %r19
+ br .L5
+
+.L5:
+ phi.32 %r20 <- %phi6(return)
+ ret.32 %r20
+
+
+ol:
+.L8:
+ <entry-point>
+ store.32 %arg1 -> 0[i]
+ store.64 %arg2 -> 0[b]
+ phisrc.32 %phi7 <- $1
+ load.32 %r21 <- 0[i]
+ setne.1 %r22 <- %r21, $0
+ cbr %r22, .L11, .L10
+
+.L10:
+ load.64 %r23 <- 0[b]
+ load.64 %r24 <- 8[%r23]
+ setne.1 %r25 <- %r24, $0
+ zext.32 %r26 <- (1) %r25
+ phisrc.32 %phi8 <- %r26
+ br .L11
+
+.L11:
+ phi.32 %r27 <- %phi7, %phi8
+ phisrc.32 %phi9(return) <- %r27
+ br .L9
+
+.L9:
+ phi.32 %r28 <- %phi9(return)
+ ret.32 %r28
+
+
+od:
+.L12:
+ <entry-point>
+ store.32 %arg1 -> 0[i]
+ store.64 %arg2 -> 0[b]
+ phisrc.32 %phi10 <- $1
+ load.32 %r29 <- 0[i]
+ setne.1 %r30 <- %r29, $0
+ cbr %r30, .L15, .L14
+
+.L14:
+ load.64 %r31 <- 0[b]
+ load.64 %r32 <- 16[%r31]
+ setfval.64 %r33 <- 0.000000e+00
+ fcmpune.1 %r34 <- %r32, %r33
+ zext.32 %r35 <- (1) %r34
+ phisrc.32 %phi11 <- %r35
+ br .L15
+
+.L15:
+ phi.32 %r36 <- %phi10, %phi11
+ phisrc.32 %phi12(return) <- %r36
+ br .L13
+
+.L13:
+ phi.32 %r37 <- %phi12(return)
+ ret.32 %r37
+
+
+as:
+.L16:
+ <entry-point>
+ store.32 %arg1 -> 0[i]
+ store.64 %arg2 -> 0[b]
+ phisrc.32 %phi13 <- $0
+ load.32 %r38 <- 0[i]
+ setne.1 %r39 <- %r38, $0
+ cbr %r39, .L18, .L19
+
+.L18:
+ load.64 %r40 <- 0[b]
+ load.32 %r41 <- 0[%r40]
+ lsr.32 %r42 <- %r41, $1
+ trunc.2 %r43 <- (32) %r42
+ setne.1 %r44 <- %r43, $0
+ zext.32 %r45 <- (1) %r44
+ phisrc.32 %phi14 <- %r45
+ br .L19
+
+.L19:
+ phi.32 %r46 <- %phi14, %phi13
+ phisrc.32 %phi15(return) <- %r46
+ br .L17
+
+.L17:
+ phi.32 %r47 <- %phi15(return)
+ ret.32 %r47
+
+
+au:
+.L20:
+ <entry-point>
+ store.32 %arg1 -> 0[i]
+ store.64 %arg2 -> 0[b]
+ phisrc.32 %phi16 <- $0
+ load.32 %r48 <- 0[i]
+ setne.1 %r49 <- %r48, $0
+ cbr %r49, .L22, .L23
+
+.L22:
+ load.64 %r50 <- 0[b]
+ load.32 %r51 <- 0[%r50]
+ lsr.32 %r52 <- %r51, $3
+ trunc.3 %r53 <- (32) %r52
+ setne.1 %r54 <- %r53, $0
+ zext.32 %r55 <- (1) %r54
+ phisrc.32 %phi17 <- %r55
+ br .L23
+
+.L23:
+ phi.32 %r56 <- %phi17, %phi16
+ phisrc.32 %phi18(return) <- %r56
+ br .L21
+
+.L21:
+ phi.32 %r57 <- %phi18(return)
+ ret.32 %r57
+
+
+al:
+.L24:
+ <entry-point>
+ store.32 %arg1 -> 0[i]
+ store.64 %arg2 -> 0[b]
+ phisrc.32 %phi19 <- $0
+ load.32 %r58 <- 0[i]
+ setne.1 %r59 <- %r58, $0
+ cbr %r59, .L26, .L27
+
+.L26:
+ load.64 %r60 <- 0[b]
+ load.64 %r61 <- 8[%r60]
+ setne.1 %r62 <- %r61, $0
+ zext.32 %r63 <- (1) %r62
+ phisrc.32 %phi20 <- %r63
+ br .L27
+
+.L27:
+ phi.32 %r64 <- %phi20, %phi19
+ phisrc.32 %phi21(return) <- %r64
+ br .L25
+
+.L25:
+ phi.32 %r65 <- %phi21(return)
+ ret.32 %r65
+
+
+ad:
+.L28:
+ <entry-point>
+ store.32 %arg1 -> 0[i]
+ store.64 %arg2 -> 0[b]
+ phisrc.32 %phi22 <- $0
+ load.32 %r66 <- 0[i]
+ setne.1 %r67 <- %r66, $0
+ cbr %r67, .L30, .L31
+
+.L30:
+ load.64 %r68 <- 0[b]
+ load.64 %r69 <- 16[%r68]
+ setfval.64 %r70 <- 0.000000e+00
+ fcmpune.1 %r71 <- %r69, %r70
+ zext.32 %r72 <- (1) %r71
+ phisrc.32 %phi23 <- %r72
+ br .L31
+
+.L31:
+ phi.32 %r73 <- %phi23, %phi22
+ phisrc.32 %phi24(return) <- %r73
+ br .L29
+
+.L29:
+ phi.32 %r74 <- %phi24(return)
+ ret.32 %r74
+
+
+ * check-output-end
+ */