<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -92,7 +92,9 @@ llvm_builder_br(VALUE self, VALUE rblock) {
 
   BasicBlock *bb;
   Data_Get_Struct(rblock, BasicBlock, bb);
-  return llvm_value_wrap(builder-&gt;CreateBr(bb)); 
+
+  Value *branch_instr = builder-&gt;CreateBr(bb);
+  return Data_Wrap_Struct(cLLVMBranchInst, NULL, NULL, branch_instr); 
 }  
 
 VALUE 
@@ -106,7 +108,8 @@ llvm_builder_cond_br(VALUE self, VALUE rcond, VALUE rtrue_block, VALUE rfalse_bl
   Data_Get_Struct(rtrue_block, BasicBlock, true_block);
   Data_Get_Struct(rfalse_block, BasicBlock, false_block);
 
-  return llvm_value_wrap(builder-&gt;CreateCondBr(cond, true_block, false_block));
+  Value *branch_instr = builder-&gt;CreateCondBr(cond, true_block, false_block);
+  return Data_Wrap_Struct(cLLVMBranchInst, NULL, NULL, branch_instr);
 }
 
 VALUE</diff>
      <filename>ext/llvm_basicblock.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -26,6 +26,37 @@ llvm_instruction_get_opcode_name(VALUE self) {
   return rb_str_new2(name.c_str());
 }
 
+#define DATA_GET_BRANCH_INST BranchInst *bi; Data_Get_Struct(self, BranchInst, bi);
+
+VALUE
+llvm_branch_inst_is_unconditional(VALUE self) {
+  DATA_GET_BRANCH_INST
+  return bi-&gt;isUnconditional() ? Qtrue : Qfalse;
+}
+
+VALUE
+llvm_branch_inst_is_conditional(VALUE self) {
+  DATA_GET_BRANCH_INST
+  return bi-&gt;isConditional() ? Qtrue : Qfalse;
+}
+
+VALUE
+llvm_branch_inst_get_condition(VALUE self) {
+  DATA_GET_BRANCH_INST
+  return llvm_value_wrap(bi-&gt;getCondition()); 
+}
+
+VALUE
+llvm_branch_inst_set_condition(VALUE self, VALUE rv) {
+  DATA_GET_BRANCH_INST
+  
+  Value *v;
+  Data_Get_Struct(rv, Value, v);
+
+  bi-&gt;setCondition(v);
+  return rv;
+}
+
 #define DATA_GET_SWITCH_INST SwitchInst *si; Data_Get_Struct(self, SwitchInst, si);
 
 VALUE</diff>
      <filename>ext/llvm_instruction.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -13,6 +13,7 @@ VALUE cLLVMArrayType = Qnil;
 VALUE cLLVMVectorType = Qnil;
 VALUE cLLVMFunctionType = Qnil;
 VALUE cLLVMInstruction = Qnil;
+VALUE cLLVMBranchInst = Qnil;
 VALUE cLLVMSwitchInst = Qnil;
 VALUE cLLVMPhi = Qnil;
 VALUE cLLVMBinaryOps = Qnil;
@@ -53,6 +54,11 @@ VALUE llvm_basic_block_get_instruction_list(VALUE);
 VALUE llvm_instruction_inspect(VALUE);
 VALUE llvm_instruction_get_opcode_name(VALUE);
 
+VALUE llvm_branch_inst_is_conditional(VALUE);
+VALUE llvm_branch_inst_is_unconditional(VALUE);
+VALUE llvm_branch_inst_get_condition(VALUE);
+VALUE llvm_branch_inst_set_condition(VALUE, VALUE);
+
 VALUE llvm_switch_inst_get_default_dest(VALUE);
 VALUE llvm_switch_inst_get_num_cases(VALUE);
 VALUE llvm_switch_inst_add_case(VALUE, VALUE, VALUE);
@@ -117,6 +123,7 @@ void Init_llvmruby() {
   cLLVMBuilder = rb_define_class_under(cLLVMRuby, &quot;Builder&quot;, rb_cObject);
 
   cLLVMInstruction = rb_define_class_under(cLLVMRuby, &quot;Instruction&quot;, rb_cObject);
+  cLLVMBranchInst = rb_define_class_under(cLLVMRuby, &quot;BranchInst&quot;, cLLVMInstruction);
   cLLVMSwitchInst = rb_define_class_under(cLLVMRuby, &quot;SwitchInst&quot;, cLLVMInstruction);
   cLLVMBinaryOps = rb_define_class_under(cLLVMInstruction, &quot;BinaryOps&quot;, rb_cObject);
   cLLVMPhi = rb_define_class_under(cLLVMRuby, &quot;Phi&quot;, cLLVMValue);
@@ -163,6 +170,11 @@ void Init_llvmruby() {
   rb_define_method(cLLVMInstruction, &quot;inspect&quot;, llvm_instruction_inspect, 0);
   rb_define_method(cLLVMInstruction, &quot;get_opcode_name&quot;, llvm_instruction_get_opcode_name, 0);
 
+  rb_define_method(cLLVMBranchInst, &quot;conditional?&quot;, llvm_branch_inst_is_conditional, 0);
+  rb_define_method(cLLVMBranchInst, &quot;unconditional?&quot;, llvm_branch_inst_is_unconditional, 0);
+  rb_define_method(cLLVMBranchInst, &quot;condition&quot;, llvm_branch_inst_get_condition, 0);
+  rb_define_method(cLLVMBranchInst, &quot;condition=&quot;, llvm_branch_inst_set_condition, 1);
+
   rb_define_method(cLLVMSwitchInst, &quot;get_default_dest&quot;, llvm_switch_inst_get_default_dest, 0);
   rb_define_method(cLLVMSwitchInst, &quot;get_num_cases&quot;, llvm_switch_inst_get_num_cases, 0);
   rb_define_method(cLLVMSwitchInst, &quot;add_case&quot;, llvm_switch_inst_add_case, 2);</diff>
      <filename>ext/llvmruby.c</filename>
    </modified>
    <modified>
      <diff>@@ -32,6 +32,7 @@ extern VALUE cLLVMArrayType;
 extern VALUE cLLVMVectorType;
 extern VALUE cLLVMFunctionType;
 extern VALUE cLLVMInstruction;
+extern VALUE cLLVMBranchInst;
 extern VALUE cLLVMSwitchInst;
 extern VALUE cLLVMBinaryOps;
 extern VALUE cLLVMPhi;</diff>
      <filename>ext/llvmruby.h</filename>
    </modified>
    <modified>
      <diff>@@ -43,4 +43,41 @@ class InstructionTests &lt; Test::Unit::TestCase
     assert(expected_opcodes_in_bswap, actual_opcodes_in_bswap)
   end
 
+  def test_branch_instructions
+    m = LLVM::Module.new('branch_instructions')
+    ExecutionEngine.get(m)
+    type = Type::function(MACHINE_WORD, [])
+
+    f = m.get_or_insert_function(&quot;test_br&quot;, type)
+    b1 = f.create_block
+    b2 = f.create_block
+    b3 = f.create_block
+    b4 = f.create_block
+
+    b = b1.builder
+    br_inst = b.br(b2)
+
+    b = b2.builder
+    cmp1 = b.icmp_sgt(-1.llvm, 1.llvm)
+    cmp2 = b.icmp_slt(-1.llvm, 1.llvm)
+    cond_br_inst = b.cond_br(cmp1, b3, b4)
+
+    b = b3.builder
+    b.return(23.llvm)
+
+    b = b4.builder
+    b.return(5.llvm)
+
+    assert_kind_of(BranchInst, br_inst)
+    assert(br_inst.unconditional?)
+    assert(!br_inst.conditional?)
+
+    assert_kind_of(BranchInst, cond_br_inst)
+    assert(cond_br_inst.conditional?)
+    assert(!cond_br_inst.unconditional?)
+    assert_kind_of(Value, cond_br_inst.condition)
+    cond_br_inst.condition = cmp2
+
+    assert_equal(23, ExecutionEngine.run_autoconvert(f))
+  end
 end</diff>
      <filename>test/test_instructions.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>05ce65372eee190044e77150770984a992f46da3</id>
    </parent>
  </parents>
  <author>
    <name>Tom Bagby</name>
    <email>tomatobagby@gmail.com</email>
  </author>
  <url>http://github.com/tombagby/llvmruby/commit/da0d2abff09f6f722bddc4dd9ba43045174e275c</url>
  <id>da0d2abff09f6f722bddc4dd9ba43045174e275c</id>
  <committed-date>2008-10-19T12:56:04-07:00</committed-date>
  <authored-date>2008-10-19T12:56:04-07:00</authored-date>
  <message>more of the branch instruction class</message>
  <tree>eec0b5e15175adc34c7434faeb16a53781bcbaf4</tree>
  <committer>
    <name>Tom Bagby</name>
    <email>tomatobagby@gmail.com</email>
  </committer>
</commit>
