All of lore.kernel.org
 help / color / mirror / Atom feed
From: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
To: linux-sparse@vger.kernel.org
Cc: Christopher Li <sparse@chrisli.org>,
	Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Subject: [PATCH v6 32/52] llvm: fix OP_SWITCH has no target
Date: Mon, 27 Mar 2017 23:23:56 +0200	[thread overview]
Message-ID: <20170327212416.18536-33-luc.vanoostenryck@gmail.com> (raw)
In-Reply-To: <20170327212416.18536-1-luc.vanoostenryck@gmail.com>

Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
 sparse-llvm.c               |   4 +-
 validation/backend/switch.c | 248 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 249 insertions(+), 3 deletions(-)
 create mode 100644 validation/backend/switch.c

diff --git a/sparse-llvm.c b/sparse-llvm.c
index 5b25bb0c1..884570e1d 100644
--- a/sparse-llvm.c
+++ b/sparse-llvm.c
@@ -771,15 +771,13 @@ static void output_op_switch(struct function *fn, struct instruction *insn)
 				 def ? def->priv : NULL, n_jmp);
 
 	FOR_EACH_PTR(insn->multijmp_list, jmp) {
-		long val;
+		long long val;
 
 		for (val = jmp->begin; val <= jmp->end; val++) {
 			LLVMValueRef Val = val_to_value(val, insn->type);
 			LLVMAddCase(target, Val, jmp->target->priv);
 		}
 	} END_FOR_EACH_PTR(jmp);
-
-	insn->target->priv = target;
 }
 
 static void output_op_call(struct function *fn, struct instruction *insn)
diff --git a/validation/backend/switch.c b/validation/backend/switch.c
new file mode 100644
index 000000000..d77250cc3
--- /dev/null
+++ b/validation/backend/switch.c
@@ -0,0 +1,248 @@
+int def(void);
+int r0(void);
+int r1(void);
+int r2(void);
+int r3(void);
+int r4(void);
+int r5(void);
+int r6(void);
+int r7(void);
+int r8(void);
+int r9(void);
+
+int small(int a)
+{
+	switch (a) {
+	case 0: return r0();
+	case 1: return r1();
+	case 2: return r2();
+	}
+
+	return def();
+}
+
+int densefull(int a)
+{
+	switch (a) {
+	case 0: return r0();
+	case 1: return r1();
+	case 2: return r2();
+	case 3: return r3();
+	case 4: return r4();
+	case 5: return r5();
+	case 6: return r6();
+	case 7: return r7();
+	case 8: return r8();
+	case 9: return r9();
+	}
+
+	return def();
+}
+
+int densepart(int a)
+{
+	switch (a) {
+	case 0: return r0();
+	case 1: return r1();
+	case 2: return r2();
+	case 3: return r3();
+	case 4: return r4();
+
+	case 6: return r6();
+	case 7: return r7();
+	case 8: return r8();
+	case 9: return r9();
+	}
+
+	return def();
+}
+
+int dense_dense_20(int a)
+{
+	switch (a) {
+	case 0: return r0();
+	case 1: return r1();
+	case 2: return r2();
+	case 3: return r3();
+	case 4: return r4();
+	case 5: return r5();
+	case 6: return r6();
+	case 7: return r7();
+	case 8: return r8();
+	case 9: return r9();
+
+	case 20: return r0();
+	case 21: return r1();
+	case 22: return r2();
+	case 23: return r3();
+	case 24: return r4();
+	case 25: return r5();
+	case 26: return r6();
+	case 27: return r7();
+	case 28: return r8();
+	case 29: return r9();
+	}
+
+	return def();
+}
+
+int dense_dense_100(int a)
+{
+	switch (a) {
+	case 0: return r0();
+	case 1: return r1();
+	case 2: return r2();
+	case 3: return r3();
+	case 4: return r4();
+	case 5: return r5();
+	case 6: return r6();
+	case 7: return r7();
+	case 8: return r8();
+	case 9: return r9();
+
+	case 100: return r0();
+	case 101: return r1();
+	case 102: return r2();
+	case 103: return r3();
+	case 104: return r4();
+	case 105: return r5();
+	case 106: return r6();
+	case 107: return r7();
+	case 108: return r8();
+	case 109: return r9();
+	}
+
+	return def();
+}
+
+int dense_dense_1000(int a)
+{
+	switch (a) {
+	case 0: return r0();
+	case 1: return r1();
+	case 2: return r2();
+	case 3: return r3();
+	case 4: return r4();
+	case 5: return r5();
+	case 6: return r6();
+	case 7: return r7();
+	case 8: return r8();
+	case 9: return r9();
+
+	case 1000: return r0();
+	case 1001: return r1();
+	case 1002: return r2();
+	case 1003: return r3();
+	case 1004: return r4();
+	case 1005: return r5();
+	case 1006: return r6();
+	case 1007: return r7();
+	case 1008: return r8();
+	case 1009: return r9();
+	}
+
+	return def();
+}
+
+int sparse(int a)
+{
+	switch (a) {
+	case 0: return r0();
+	case 3: return r1();
+	case 12: return r2();
+	case 31: return r3();
+	case 54: return r4();
+	case 75: return r5();
+	case 96: return r6();
+	case 107: return r7();
+	case 189: return r8();
+	case 999: return r9();
+	}
+
+	return def();
+}
+
+int range_simple(int a)
+{
+	switch (a) {
+	case 1 ... 9: return r0();
+	}
+
+	return def();
+}
+
+int range_complex(int a)
+{
+	switch (a) {
+	case -1: return r0();
+	case 1 ... 9: return r0();
+	case 10 ... 19: return r1();
+	case 200 ... 202: return r2();
+	case 300 ... 303: return r3();
+	}
+
+	return def();
+}
+
+void switch_call(int a)
+{
+	int r;
+
+	switch (a) {
+	case 0: r0(); break;
+	case 1: r1(); break;
+	case 2: r2(); break;
+	case 3: r3(); break;
+	case 4: r4(); break;
+	case 5: r5(); break;
+	case 6: r6(); break;
+	case 7: r7(); break;
+	case 8: r8(); break;
+	case 9: r9(); break;
+	}
+}
+
+int switch_retcall(int a)
+{
+	int r = 0;
+
+	switch (a) {
+	case 0: r = r0(); break;
+	case 1: r = r1(); break;
+	case 2: r = r2(); break;
+	case 3: r = r3(); break;
+	case 4: r = r4(); break;
+	case 5: r = r5(); break;
+	case 6: r = r6(); break;
+	case 7: r = r7(); break;
+	case 8: r = r8(); break;
+	case 9: r = r9(); break;
+	}
+
+	return r;
+}
+
+int switch_cmov(int a)
+{
+	int r;
+
+	switch (a) {
+	case 0: r = 3; break;
+	case 1: r = 1; break;
+	case 2: r = 7; break;
+	case 3: r = 2; break;
+	case 4: r = 9; break;
+
+	case 6: r = 5; break;
+	case 7: r = 8; break;
+	case 8: r = 6; break;
+	case 9: r = 4; break;
+	}
+
+	return r;
+}
+
+/*
+ * check-name: llvm-switch
+ * check-command: ./sparsec -Wno-decl -c $file -o tmp.o
+ */
-- 
2.12.0


  parent reply	other threads:[~2017-03-27 21:26 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-27 21:23 [PATCH v6 00/52] LLVM fixes Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 01/52] llvm: remove unneeded arg 'module' Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 02/52] llvm: remove unneeded 'generation' Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 03/52] llvm: remove unneeded function::type Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 04/52] llvm: reduce scope of 'bb_nr' Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 05/52] llvm: use pseudo_list_size() instead of open coding it Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 06/52] llvm: give arguments a name Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 07/52] llvm: give a name to call's return values Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 08/52] llvm: avoid useless temp variable Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 09/52] llvm: extract get_sym_value() from pseudo_to_value() Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 10/52] llvm: fix test of floating-point type Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 11/52] llvm: fix translation of PSEUDO_VALs into a ValueRefs Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 12/52] llvm: fix output_op_store() which modify its operand Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 13/52] llvm: fix output_op_[ptr]cast() Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 14/52] llvm: take care of degenerated rvalues Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 15/52] llvm: add test cases for symbol's address Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 16/52] llvm: add test cases for pointers passed as argument Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 17/52] llvm: add test cases for arrays " Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 18/52] llvm: add test cases for degenerated pointers Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 19/52] llvm: add support for OP_NEG Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 20/52] llvm: add support for OP_SETVAL with floats Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 21/52] llvm: add support for OP_SETVAL with labels Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 22/52] llvm: ignore OP_INLINED_CALL Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 23/52] llvm: fix pointer/float mixup in comparisons Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 24/52] llvm: fix type in comparison with an address constant Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 25/52] llvm: give correct type to binops Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 26/52] llvm: adjust OP_RET's type Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 27/52] llvm: variadic functions are not being marked as such Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 28/52] llvm: fix type of switch constants Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 29/52] llvm: make pseudo_name() more flexible Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 30/52] llvm: give a name to all values Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 31/52] llvm: add support for OP_SWITCH with a range Luc Van Oostenryck
2017-03-27 21:23 ` Luc Van Oostenryck [this message]
2017-03-27 21:23 ` [PATCH v6 33/52] llvm: make value_to_pvalue() more flexible Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 34/52] llvm: make value_to_ivalue() " Luc Van Oostenryck
2017-03-27 21:23 ` [PATCH v6 35/52] llvm: add test case pointer compare with cast Luc Van Oostenryck
2017-03-27 21:24 ` [PATCH v6 36/52] llvm: let pseudo_to_value() directly use the type Luc Van Oostenryck
2017-03-27 21:24 ` [PATCH v6 37/52] llvm: remove unneeded pseudo_to_value() unneeded argument Luc Van Oostenryck
2017-03-27 21:24 ` [PATCH v6 38/52] llvm: introduce get_ioperand() Luc Van Oostenryck
2017-03-27 21:24 ` [PATCH v6 39/52] llvm: fix mutating function pointer Luc Van Oostenryck
2017-03-27 21:24 ` [PATCH v6 40/52] llvm: fix mutated OP_RET Luc Van Oostenryck
2017-03-27 21:24 ` [PATCH v6 41/52] llvm: fix mutated OP_SEL Luc Van Oostenryck
2017-03-27 21:24 ` [PATCH v6 42/52] llvm: fix mutated OP_SWITCH Luc Van Oostenryck
2017-03-27 21:24 ` [PATCH v6 43/52] llvm: fix mutated OP_PHISOURCE Luc Van Oostenryck
2017-03-27 21:24 ` [PATCH v6 44/52] llvm: fix mutated OP_[PTR]CAST Luc Van Oostenryck
2017-03-27 21:24 ` [PATCH v6 45/52] llvm: add support for restricted types Luc Van Oostenryck
2017-03-27 21:24 ` [PATCH v6 46/52] llvm: fix get value from initialized symbol Luc Van Oostenryck
2017-03-27 21:24 ` [PATCH v6 47/52] llvm: fix get value from non-anonymous symbol Luc Van Oostenryck
2017-03-27 21:24 ` [PATCH v6 48/52] llvm: fix type of bitfields Luc Van Oostenryck
2017-03-27 21:24 ` [PATCH v6 49/52] llvm: add support for OP_FPCAST Luc Van Oostenryck
2017-03-27 21:24 ` [PATCH v6 50/52] llvm: add support for cast from floats Luc Van Oostenryck
2017-03-27 21:24 ` [PATCH v6 51/52] llvm: cleanup of output_[ptr]cast() Luc Van Oostenryck
2017-03-27 21:24 ` [PATCH v6 52/52] llvm: fix creation of sparsec's tmp files Luc Van Oostenryck
2017-03-31  5:28 ` [PATCH v6 00/52] LLVM fixes Christopher Li
2017-03-31  5:32   ` Christopher Li
2017-03-31  8:56     ` Luc Van Oostenryck
2017-04-01 10:53 ` [GIT PULL v6] " Luc Van Oostenryck

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170327212416.18536-33-luc.vanoostenryck@gmail.com \
    --to=luc.vanoostenryck@gmail.com \
    --cc=linux-sparse@vger.kernel.org \
    --cc=sparse@chrisli.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.