Bill Wendling | f6fb7ed | 2011-10-12 23:03:40 +0000 | [diff] [blame^] | 1 | ; RUN: llc -verify-machineinstrs < %s |
| 2 | ; <rdar://problem/10270968> |
| 3 | target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" |
| 4 | target triple = "x86_64-apple-macosx10.7.2" |
| 5 | |
| 6 | %struct.optab = type { i32, [59 x %struct.anon.3] } |
| 7 | %struct.anon.3 = type { i32, %struct.rtx_def* } |
| 8 | %struct.rtx_def = type { [2 x i8], i8, i8, [1 x %union.rtunion_def] } |
| 9 | %union.rtunion_def = type { i64 } |
| 10 | %struct.insn_data = type { i8*, i8*, %struct.rtx_def* (%struct.rtx_def*, ...)*, %struct.insn_operand_data*, i8, i8, i8, i8 } |
| 11 | %struct.insn_operand_data = type { i32 (%struct.rtx_def*, i32)*, i8*, [2 x i8], i8, i8 } |
| 12 | |
| 13 | @optab_table = external global [49 x %struct.optab*], align 16 |
| 14 | @insn_data = external constant [0 x %struct.insn_data] |
| 15 | |
| 16 | define %struct.rtx_def* @gen_add3_insn(%struct.rtx_def* %r0, %struct.rtx_def* %r1, %struct.rtx_def* %c) nounwind uwtable ssp { |
| 17 | entry: |
| 18 | %0 = bitcast %struct.rtx_def* %r0 to i32* |
| 19 | %1 = load i32* %0, align 8 |
| 20 | %2 = lshr i32 %1, 16 |
| 21 | %bf.clear = and i32 %2, 255 |
| 22 | %idxprom = sext i32 %bf.clear to i64 |
| 23 | %3 = load %struct.optab** getelementptr inbounds ([49 x %struct.optab*]* @optab_table, i32 0, i64 0), align 8, !tbaa !0 |
| 24 | %handlers = getelementptr inbounds %struct.optab* %3, i32 0, i32 1 |
| 25 | %arrayidx = getelementptr inbounds [59 x %struct.anon.3]* %handlers, i32 0, i64 %idxprom |
| 26 | %insn_code = getelementptr inbounds %struct.anon.3* %arrayidx, i32 0, i32 0 |
| 27 | %4 = load i32* %insn_code, align 4, !tbaa !3 |
| 28 | %cmp = icmp eq i32 %4, 1317 |
| 29 | br i1 %cmp, label %if.then, label %lor.lhs.false |
| 30 | |
| 31 | lor.lhs.false: ; preds = %entry |
| 32 | %idxprom1 = sext i32 %4 to i64 |
| 33 | %arrayidx2 = getelementptr inbounds [0 x %struct.insn_data]* @insn_data, i32 0, i64 %idxprom1 |
| 34 | %operand = getelementptr inbounds %struct.insn_data* %arrayidx2, i32 0, i32 3 |
| 35 | %5 = load %struct.insn_operand_data** %operand, align 8, !tbaa !0 |
| 36 | %arrayidx3 = getelementptr inbounds %struct.insn_operand_data* %5, i64 0 |
| 37 | %predicate = getelementptr inbounds %struct.insn_operand_data* %arrayidx3, i32 0, i32 0 |
| 38 | %6 = load i32 (%struct.rtx_def*, i32)** %predicate, align 8, !tbaa !0 |
| 39 | %idxprom4 = sext i32 %4 to i64 |
| 40 | %arrayidx5 = getelementptr inbounds [0 x %struct.insn_data]* @insn_data, i32 0, i64 %idxprom4 |
| 41 | %operand6 = getelementptr inbounds %struct.insn_data* %arrayidx5, i32 0, i32 3 |
| 42 | %7 = load %struct.insn_operand_data** %operand6, align 8, !tbaa !0 |
| 43 | %arrayidx7 = getelementptr inbounds %struct.insn_operand_data* %7, i64 0 |
| 44 | %8 = bitcast %struct.insn_operand_data* %arrayidx7 to i8* |
| 45 | %bf.field.offs = getelementptr i8* %8, i32 16 |
| 46 | %9 = bitcast i8* %bf.field.offs to i32* |
| 47 | %10 = load i32* %9, align 8 |
| 48 | %bf.clear8 = and i32 %10, 65535 |
| 49 | %call = tail call i32 %6(%struct.rtx_def* %r0, i32 %bf.clear8) |
| 50 | %tobool = icmp ne i32 %call, 0 |
| 51 | br i1 %tobool, label %lor.lhs.false9, label %if.then |
| 52 | |
| 53 | lor.lhs.false9: ; preds = %lor.lhs.false |
| 54 | %idxprom10 = sext i32 %4 to i64 |
| 55 | %arrayidx11 = getelementptr inbounds [0 x %struct.insn_data]* @insn_data, i32 0, i64 %idxprom10 |
| 56 | %operand12 = getelementptr inbounds %struct.insn_data* %arrayidx11, i32 0, i32 3 |
| 57 | %11 = load %struct.insn_operand_data** %operand12, align 8, !tbaa !0 |
| 58 | %arrayidx13 = getelementptr inbounds %struct.insn_operand_data* %11, i64 1 |
| 59 | %predicate14 = getelementptr inbounds %struct.insn_operand_data* %arrayidx13, i32 0, i32 0 |
| 60 | %12 = load i32 (%struct.rtx_def*, i32)** %predicate14, align 8, !tbaa !0 |
| 61 | %idxprom15 = sext i32 %4 to i64 |
| 62 | %arrayidx16 = getelementptr inbounds [0 x %struct.insn_data]* @insn_data, i32 0, i64 %idxprom15 |
| 63 | %operand17 = getelementptr inbounds %struct.insn_data* %arrayidx16, i32 0, i32 3 |
| 64 | %13 = load %struct.insn_operand_data** %operand17, align 8, !tbaa !0 |
| 65 | %arrayidx18 = getelementptr inbounds %struct.insn_operand_data* %13, i64 1 |
| 66 | %14 = bitcast %struct.insn_operand_data* %arrayidx18 to i8* |
| 67 | %bf.field.offs19 = getelementptr i8* %14, i32 16 |
| 68 | %15 = bitcast i8* %bf.field.offs19 to i32* |
| 69 | %16 = load i32* %15, align 8 |
| 70 | %bf.clear20 = and i32 %16, 65535 |
| 71 | %call21 = tail call i32 %12(%struct.rtx_def* %r1, i32 %bf.clear20) |
| 72 | %tobool22 = icmp ne i32 %call21, 0 |
| 73 | br i1 %tobool22, label %lor.lhs.false23, label %if.then |
| 74 | |
| 75 | lor.lhs.false23: ; preds = %lor.lhs.false9 |
| 76 | %idxprom24 = sext i32 %4 to i64 |
| 77 | %arrayidx25 = getelementptr inbounds [0 x %struct.insn_data]* @insn_data, i32 0, i64 %idxprom24 |
| 78 | %operand26 = getelementptr inbounds %struct.insn_data* %arrayidx25, i32 0, i32 3 |
| 79 | %17 = load %struct.insn_operand_data** %operand26, align 8, !tbaa !0 |
| 80 | %arrayidx27 = getelementptr inbounds %struct.insn_operand_data* %17, i64 2 |
| 81 | %predicate28 = getelementptr inbounds %struct.insn_operand_data* %arrayidx27, i32 0, i32 0 |
| 82 | %18 = load i32 (%struct.rtx_def*, i32)** %predicate28, align 8, !tbaa !0 |
| 83 | %idxprom29 = sext i32 %4 to i64 |
| 84 | %arrayidx30 = getelementptr inbounds [0 x %struct.insn_data]* @insn_data, i32 0, i64 %idxprom29 |
| 85 | %operand31 = getelementptr inbounds %struct.insn_data* %arrayidx30, i32 0, i32 3 |
| 86 | %19 = load %struct.insn_operand_data** %operand31, align 8, !tbaa !0 |
| 87 | %arrayidx32 = getelementptr inbounds %struct.insn_operand_data* %19, i64 2 |
| 88 | %20 = bitcast %struct.insn_operand_data* %arrayidx32 to i8* |
| 89 | %bf.field.offs33 = getelementptr i8* %20, i32 16 |
| 90 | %21 = bitcast i8* %bf.field.offs33 to i32* |
| 91 | %22 = load i32* %21, align 8 |
| 92 | %bf.clear34 = and i32 %22, 65535 |
| 93 | %call35 = tail call i32 %18(%struct.rtx_def* %c, i32 %bf.clear34) |
| 94 | %tobool36 = icmp ne i32 %call35, 0 |
| 95 | br i1 %tobool36, label %if.end, label %if.then |
| 96 | |
| 97 | if.then: ; preds = %lor.lhs.false23, %lor.lhs.false9, %lor.lhs.false, %entry |
| 98 | br label %return |
| 99 | |
| 100 | if.end: ; preds = %lor.lhs.false23 |
| 101 | %idxprom37 = sext i32 %4 to i64 |
| 102 | %arrayidx38 = getelementptr inbounds [0 x %struct.insn_data]* @insn_data, i32 0, i64 %idxprom37 |
| 103 | %genfun = getelementptr inbounds %struct.insn_data* %arrayidx38, i32 0, i32 2 |
| 104 | %23 = load %struct.rtx_def* (%struct.rtx_def*, ...)** %genfun, align 8, !tbaa !0 |
| 105 | %call39 = tail call %struct.rtx_def* (%struct.rtx_def*, ...)* %23(%struct.rtx_def* %r0, %struct.rtx_def* %r1, %struct.rtx_def* %c) |
| 106 | br label %return |
| 107 | |
| 108 | return: ; preds = %if.end, %if.then |
| 109 | %24 = phi %struct.rtx_def* [ %call39, %if.end ], [ null, %if.then ] |
| 110 | ret %struct.rtx_def* %24 |
| 111 | } |
| 112 | |
| 113 | !0 = metadata !{metadata !"any pointer", metadata !1} |
| 114 | !1 = metadata !{metadata !"omnipotent char", metadata !2} |
| 115 | !2 = metadata !{metadata !"Simple C/C++ TBAA", null} |
| 116 | !3 = metadata !{metadata !"_ZTS9insn_code", metadata !1} |