Changes in directory llvm-gcc/gcc:
llvm-expand.c updated: 1.117 -> 1.118 llvm-representation.c updated: 1.20 -> 1.21 llvm-representation.h updated: 1.19 -> 1.20 --- Log message: Allow switch statements on long-long values to be correctly handled. This fixes PR671: http://llvm.cs.uiuc.edu/PR671 and llvm-test/SingleSource/UnitTests/2005-11-29-LongSwitch.c --- Diffs of the changes: (+25 -11) llvm-expand.c | 23 ++++++++++++++--------- llvm-representation.c | 11 ++++++++++- llvm-representation.h | 2 +- 3 files changed, 25 insertions(+), 11 deletions(-) Index: llvm-gcc/gcc/llvm-expand.c diff -u llvm-gcc/gcc/llvm-expand.c:1.117 llvm-gcc/gcc/llvm-expand.c:1.118 --- llvm-gcc/gcc/llvm-expand.c:1.117 Wed Sep 28 02:16:59 2005 +++ llvm-gcc/gcc/llvm-expand.c Tue Nov 29 12:25:04 2005 @@ -2022,8 +2022,8 @@ add_scope_stack(Fn, &Fn->ExpandInfo->InnermostCaseScope, CASE_NESTING); llvm_instruction *SI = llvm_instruction_new(VoidTy, "", O_Switch, 2); llvm_value *Val = llvm_expand_expr(Fn, expr, 0); - - SI->Operands[0] = cast_if_type_not_equal(Fn, Val, UIntTy); + assert(llvm_type_is_integral(Val->Ty) && "Not an integer switch expr!"); + SI->Operands[0] = Val; append_inst(Fn, SI); thiscase->x.switchblock.SwitchInst = SI; @@ -2083,6 +2083,15 @@ pop_and_free_scope_stack(Fn, &Fn->ExpandInfo->InnermostCaseScope); } +static unsigned long long getIntCstAsLongLong(tree V) { + unsigned HOST_WIDE_INT HI = (unsigned HOST_WIDE_INT)TREE_INT_CST_HIGH(V); + unsigned HOST_WIDE_INT LO = (unsigned HOST_WIDE_INT)TREE_INT_CST_LOW(V); + if (sizeof(LO) == 8) return LO; + + assert(sizeof(LO) == 4 && "64 and 32 bit HOST_WIDE_INT's supported!"); + return ((long long)(unsigned)HI << 32) | (long long)(unsigned)LO; +} + /* Add a case label to the current switch statement. This could be a range of case values to insert. Handle them as appropriate. */ @@ -2091,7 +2100,7 @@ llvm_nesting *thiscase = Fn->ExpandInfo->InnermostCaseScope; llvm_instruction *SwitchInst; llvm_basicblock *Block = getLabelDeclBlock(label); - int Low, High; + long long Low, High; assert(thiscase && "Case label not in case statement!"); SwitchInst = thiscase->x.switchblock.SwitchInst; @@ -2111,12 +2120,8 @@ } } - if ((TREE_INT_CST_HIGH(low) != 0 || TREE_INT_CST_HIGH(high) != 0) && - (TREE_INT_CST_HIGH(low) != -1 || TREE_INT_CST_HIGH(high) != -1)) - LLVM_TODO_TREE(label); /* Cannot handle case values this large! */ - - Low = (int)TREE_INT_CST_LOW(low); - High = (int)TREE_INT_CST_LOW(high); + Low = getIntCstAsLongLong(low); + High = getIntCstAsLongLong(high); for (; Low != High+1; ++Low) { llvm_switch_case *NewCase = xmalloc(sizeof(llvm_switch_case)); Index: llvm-gcc/gcc/llvm-representation.c diff -u llvm-gcc/gcc/llvm-representation.c:1.20 llvm-gcc/gcc/llvm-representation.c:1.21 --- llvm-gcc/gcc/llvm-representation.c:1.20 Sat Sep 24 03:33:56 2005 +++ llvm-gcc/gcc/llvm-representation.c Tue Nov 29 12:25:04 2005 @@ -708,7 +708,16 @@ fprintf(F, " ["); for (; C; C = C->Next) { - fprintf(F, "\n\t\tuint %u, ", C->Value); + switch (Operand->Ty->ID) { + case UByteTyID: fprintf(F, "\n\t\tubyte %u, ", (unsigned char)C->Value); break; + case SByteTyID: fprintf(F, "\n\t\tsbyte %d, ", (signed char)C->Value); break; + case UShortTyID: fprintf(F, "\n\t\tushort %u, ", (unsigned short)C->Value); break; + case ShortTyID: fprintf(F, "\n\t\tshort %d, ", (signed short)C->Value); break; + case UIntTyID: fprintf(F, "\n\t\tuint %u, ", (unsigned)C->Value); break; + case IntTyID: fprintf(F, "\n\t\tint %d, ", (signed)C->Value); break; + case ULongTyID: fprintf(F, "\n\t\tulong %llu, ", C->Value); break; + case LongTyID: fprintf(F, "\n\t\tlong %lld, ", C->Value); break; + } llvm_value_print_operand(D2V(C->Dest), 1, F); } fprintf(F, "\n\t]"); Index: llvm-gcc/gcc/llvm-representation.h diff -u llvm-gcc/gcc/llvm-representation.h:1.19 llvm-gcc/gcc/llvm-representation.h:1.20 --- llvm-gcc/gcc/llvm-representation.h:1.19 Thu Jul 28 13:50:28 2005 +++ llvm-gcc/gcc/llvm-representation.h Tue Nov 29 12:25:04 2005 @@ -154,7 +154,7 @@ typedef struct llvm_switch_case { struct llvm_switch_case *Next; - unsigned Value; + unsigned long long Value; struct llvm_basicblock *Dest; } llvm_switch_case; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits